苹果文档TN2151这样说是出于EXC_BREAKPOINT
/SIGTRAP
的可能原因:
具有 nil 值的非可选类型
但是像这样的代码无法编译:
var x = "hello"
x = nil
那么在什么情况下非可选可以获得nil
值呢?
在桥接到 Swift 的 Objective-C 中考虑这样的事情:
- (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
在与目标 C 互操作时发生。一个 objc 方法可以注释为nonnull
,但没有什么能阻止它返回nil
。编译器只捕获最明显的情况,即使这样,它也只会产生警告(例如,当你在指定为不返回 nil 的方法中公然return nil;
时(。