发现可选值错误 nil swift 3

Posted

技术标签:

【中文标题】发现可选值错误 nil swift 3【英文标题】:optional value error found nil swift 3 【发布时间】:2016-12-02 22:28:50 【问题描述】:

我试图为 var 分配一个值,但出现以下错误:致命错误:在展开可选值时意外发现 nil。

代码:

vehicle.chassis = Chasis.text

但变量不是可选的,我这样声明变量:

var vehicle: Vehicle!

我该如何解决这个问题?

check the image

【问题讨论】:

这是一个 Optional,特别是“隐式展开的 Optional”。 但这就是为什么我要分配一个值,以确保不再为零:-( 我已经查看了那个帖子 你知道在这种情况下赋值的适当方法是什么吗? 好的,我已经发布了我认为是您的问题的答案。 【参考方案1】:

您正在尝试将 属性 设置为不存在的实例,因为隐式展开的 Optional vehicle 为 nil。

如果vehicle 为零,则不能设置vehicle.chassis

在访问 .chassis 之前,您必须在某处使用 Vehicle 的实例填充 vehicle,例如在 init 或 viewDidLoad 等中:

vehicle = Vehicle()

然后你可以访问.chassis属性:

vehicle.chassis = Chasis.text

【讨论】:

【参考方案2】:

为了澄清上述一些评论者已经提到的内容,您将您的属性声明为隐式展开的可选(此处为 IUO)。只有 Swift 中的 optionals 可以为 nil,但 optionals 必须被解包,IUO 不需要被解包,但可能会崩溃。 IUO 的存在有两个原因。

    提供对您的属性的不安全/更原始的访问,以更快地实现根深蒂固的 Objective-C 设计模式。也就是说,直接对可能为 nil 也可能不是 nil 的“指针”采取行动,并在它为 nil 时崩溃。 为属性提供一个非可选接口,您不能保证这些属性会在您的类/结构初始化完成时被初始化,但您可以保证会在您使用它时被初始化。对于编译器无法验证但您作为程序员可以验证的东西很有用。

话虽如此,我只能想到 2 种以 Swifty 方式使用 IUO 的合理正确方法,1 种用于 IBOutlets,这些不是由 swift 编译器编译的,在 init() 之后不存在,而是保证在您使用它时完成(如果您的笔尖没有损坏),是 IUO 的完美用例。 另一个虽然可以围绕它进行设计的必要性较低,但您需要延迟读取的数据库模型(无论如何实现它本身有点痛苦)

【讨论】:

以上是关于发现可选值错误 nil swift 3的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 更新中的错误 - 在展开可选值时意外发现 nil

SWIFT 致命错误:在展开可选值 (lldb) 时意外发现 nil

Swift 错误致命错误:在展开可选值时意外发现 nil

swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称

在 SWIFT 3.0 中展开可选值时意外发现 nil

Swift:致命错误:在展开可选值时意外发现 nil