Ответ 1
Рассмотрим что-то вроде этого в Objective-C, соединенном с Swift:
- (NSObject * _Nonnull)someObject {
return nil;
}
Функция аннотируется как _Nonnull
, но возвращает nil. Это связано с нештатным объектом для Swift и сбой.
Документация Apple TN2151 говорит об этом для возможной причины EXC_BREAKPOINT
/SIGTRAP
:
необязательный тип с нулевым значением
Но такой код не будет компилироваться:
var x = "hello"
x = nil
Итак, при каких обстоятельствах невращаемый может получить значение nil
?
Рассмотрим что-то вроде этого в Objective-C, соединенном с Swift:
- (NSObject * _Nonnull)someObject {
return nil;
}
Функция аннотируется как _Nonnull
, но возвращает nil. Это связано с нештатным объектом для Swift и сбой.
Препятствовано, но возможно:
class C {}
let x: C? = nil
let y: C = unsafeBitCast(x, to: C.self)
print(y) // boom
Случается при взаимодействии с Objective C. objc-метод может быть аннотирован как nonnull
, но ничто не мешает ему возвращать nil
. Компилятор улавливает только самые очевидные случаи, и даже тогда он выдает предупреждения (например, когда вы внятно return nil;
в методе, который указан как не возвращающий нуль.)
Я не знаю точно, но, возможно, это произойдет, если вы принудительно-разворачиваете (!) необязательно в переменную Non-Optional следующим образом:
let a : String? = nil
var x = "hello"
x = a!
Но это просто догадка...