Estoy trabajando en un proyecto mixto objc y swift, y noté que cuando tengo una propiedad Int en una clase Swift que tiene un valor 0 cuando leo este valor del código Objc, devuelve nil .
Una clase Swift con una propiedad de número entero que es visible desde ObjC:
@objc class SwiftInt: NSObject { @objc let testInt: Int = 0 } Ahora, cuando leo esta propiedad en un código Objc, dice que testInt es nil :
- (void)viewDidLoad { [super viewDidLoad]; SwiftInt *swiftInt = [SwiftInt new]; if (swiftInt.testInt == nil) { NSLog(@"This shouldn't be nil"); } } Si configuro cualquier otro número que no sea 0, ese valor se devuelve correctamente, pero para 0 devuelve cero. La pregunta es ¿por qué esto es nil en Objc cuando Int es un tipo primitivo y no es opcional? Estoy usando Swift 4.2.
Porque en Objective-C nil se define como __DARWIN_NULL :
#ifndef nil # if __has_feature(cxx_nullptr) # define nil nullptr # else # define nil __DARWIN_NULL # endif #endif Que se define como (void *)0 en Obj-C
Entonces tu código:
if (swiftInt.testInt == nil) { ... } if (0 == nil) { ... } if (0 == 0) { ... }que siempre es verdad
Buen artículo sobre nil en Obj-C http://benford.me/blog/the-macro-behind-nil/