Swift 非可选值如何获得nil值?
之所以这样说,可能是因为出现了Swift 非可选值如何获得nil值?,swift,Swift,之所以这样说,可能是因为出现了EXC\u断点/SIGTRAP: 具有nil值的非可选类型 但这样的代码无法编译: var x = "hello" x = nil 那么,在什么情况下,非可选变量可以获得nil值呢?我不确定,但如果您将可选变量强制展开(!)到非可选变量中,可能会发生这种情况,如下所示: let a : String? = nil var x = "hello" x = a! 但这只是一个猜测…考虑一下连接到Swift的Objective-C中的类似内容: - (NSObject
EXC\u断点
/SIGTRAP
:
具有nil值的非可选类型
但这样的代码无法编译:
var x = "hello"
x = nil
那么,在什么情况下,非可选变量可以获得
nil
值呢?我不确定,但如果您将可选变量强制展开(!)到非可选变量中,可能会发生这种情况,如下所示:
let a : String? = nil
var x = "hello"
x = a!
但这只是一个猜测…考虑一下连接到Swift的Objective-C中的类似内容:
- (NSObject * _Nonnull)someObject {
return nil;
}
该函数被注释为
\u Nonnull
,但将返回nil。这将作为Swift的非可选对象桥接,并将崩溃。在与目标C交互操作时发生。objc方法可以注释为nonnull
,但没有任何东西阻止它返回nil
。编译器只捕获最明显的情况,即使在这种情况下,它也只生成警告(例如,当您在指定为不返回nil的方法中公然返回nil;)人为,但可能:
class C {}
let x: C? = nil
let y: C = unsafeBitCast(x, to: C.self)
print(y) // boom
读这个。它给出了一个很好的解释。它仍然使用optionals。OP询问的是一个非可选类型的崩溃。事实上,您的程序将崩溃,出现
致命错误:在打开可选值时意外发现nil。
@AnhTrungPham,它将崩溃,原因与OP在其问题中提到的不同。这是最常见的原因。有很多iOS(和macOS)API被错误地标记为\u Nonnull
。例如,请参阅“我们修复了许多参数和返回值具有不正确可空性的地方”中标题为“可空性”的部分。或者只是不安全比特广播(0,to:C.self)
回到[Objective-]C类型的演员射中自己的脚,总是优雅:)只是一句话:unsafeBitCast成功,因为对于引用类型,C
和C?
的实例是指针,因此大小相同。使用struct C{}
时,unsafeBitCast将已经崩溃(不能在不同大小的类型之间解除安全位广播)。@MartinR-Yeah。这是我非常喜欢的,在大多数结构中,Optional
是一个包含鉴别器和有效负载结构的元组,而在类中,Optional
将nil
值打包为0指针