【发布时间】:2014-09-24 16:47:24
【问题描述】:
这真的让我很困惑:隐式展开的可选项和类型本身有什么区别?
例如,
var s:String!
var s2: String
这两个不完全一样吗?它们代表一个不能为 nil 的字符串,那么我们到底为什么需要 !东西?
【问题讨论】:
这真的让我很困惑:隐式展开的可选项和类型本身有什么区别?
例如,
var s:String!
var s2: String
这两个不完全一样吗?它们代表一个不能为 nil 的字符串,那么我们到底为什么需要 !东西?
【问题讨论】:
隐式展开的可选是一个可选,实际上你可以分配一个nil值
var s: String! = nil
但是声明为隐式解包,您不必每次使用它时都附加?,因此,正如其名称所述,它是隐式解包的,因为它应该包含一个非零值。
后果:如果隐式展开为 nil,则很可能在您的代码中使用它时会生成运行时异常 - 例如:
let s: String! = nil
var s1: String = s // Execution was interrupted, reason: EXC_BAD_INSTRUCTION ...
问题可能变成:为什么存在隐式展开的选项?答案是他们需要Resolving Strong Reference Cycles Between Class Instances,以及其他一些情况。
我个人会避免在我的代码中声明隐式展开的变量,除非我有很好的理由(例如解决引用循环,如上所述)
【讨论】: