Почему в нулевом Swift Int читается ноль в коде objc? - PullRequest
2 голосов
/ 21 марта 2019

Я работаю над смешанным проектом objc и swift, и я заметил, что когда у меня есть свойство Int в классе Swift, которое имеет значение 0, когда я читаю это значение из кода Objc, оно возвращает nil.

Класс Swift с целочисленным свойством, видимым из ObjC:

@objc
class SwiftInt: NSObject {

    @objc let testInt: Int = 0
}

Теперь, когда я читаю это свойство в коде Objc, оно говорит, что testInt равно nil:

- (void)viewDidLoad {
    [super viewDidLoad];
    SwiftInt *swiftInt = [SwiftInt new];
    if (swiftInt.testInt == nil) {
        NSLog(@"This shouldn't be nil");
    }
}

Если я установлю любое другое число, кроме 0, это значение будет возвращено правильно, но для 0 оно возвращает ноль. Вопрос в том, почему это nil в Objc, когда Int является примитивным типом и не является необязательным? Я использую Swift 4.2.

1 Ответ

7 голосов
/ 21 марта 2019

Потому что в Objective-C nil определяется как __DARWIN_NULL:

#ifndef nil
# if __has_feature(cxx_nullptr)
#   define nil nullptr
# else
#   define nil __DARWIN_NULL
# endif
#endif

Что определено как (void *)0 в Obj-C

Так твой код:

if (swiftInt.testInt == nil) { ... }
if (0 == nil) { ... }
if (0 == 0) { ... }

Что всегда верно

Хорошая статья о nil в Obj-C http://benford.me/blog/the-macro-behind-nil/

...