Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 非可选值如何获得nil值?_Swift - Fatal编程技术网

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指针