IOS Swift:类别属性,包含implicity unwrapped可选vs无

时间:2015-07-31 11:18:23

标签: ios swift ios8

我很好奇下面这两个类之间的差异。正如你所看到的,唯一的区别是在第二个Book类中我将title声明为一个隐式解包的可选项。 let title:String&的区别是什么? let title:String!他们似乎以同样的方式行事。哪种更好的做法?

class Book {

    let title: String

    init(title: String) {
        self.title = title
    }
}

class Book {

    let title: String!

    init(title: String) {
        self.title = title
    }
}

2 个答案:

答案 0 :(得分:2)

除非必须,否则不要将值包装在期权或隐式解包的期权中。

StringString!是两种不同的类型。 let title: String仅为String,而let title: String!的类型为ImplicitlyUnwrappedOptional<String>。必须通过包装类型取消引用对字符串值的每次访问。

为了说明问题,让我们问一个愚蠢的问题:为什么不将字符串值存储在数组中?

let title: [String]

let title: [String]的类型为Array<String>,您可以使用title.first访问字符串值。你不这样做的原因是因为title只有一个值,所以没有理由将值包装在一个封闭的类型中。

隐式展开的可选项也是如此。任何时候title都不能nil,所以没有理由将值包装在封闭类型中。

那就是说,如果没有查看程序集,我会假设编译器会优化隐式解包的可选项。

答案 1 :(得分:0)

基本区别在于,当您知道在某个时间点之后您知道它之后会有一个值并且之后永远不会为零时,会使用Implicitly Unwrapped选项。但是你仍然可以使用Implicitly Unwrapped选项的选项的所有功能,例如与nil和可选绑定进行比较。

现在使用普通变量,您无法灵活地使用nil进行检查。

同样,对于隐式展开的选项,您可以确保仍然可以将nil作为初始值设定项中的值传递,但如果值传递一次,则此后它将永远不会为零。它只是对于未包装的选项,您将获得默认值nil。

但最后完全取决于你的用例。

甚至引用了iTunes上的快速书:

  

如果在首次定义可选项后立即确认可选项的值存在,并且可以假定在此后的每个点都存在,则隐式解包的选项会很有用。 Swift中隐式解包选项的主要用途是在类初始化期间。