发现可选值错误 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