何时使用展开的选项作为类型定义的一部分

时间:2015-06-26 07:15:36

标签: ios swift initialization optional

让我们说,我们定义一个类

class C{
    var unwrapped : String!
    var nonOptional : String

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

我们创建了一个C:

的实例
var c = C(nonOptional: "hola")

我看到的是两个属性之间的主要区别在于没有必要初始化一个未包装的属性,并且你可以进行比较,如:

if c.unwrapped == nil{
   // Do whatever
}

虽然非可选属性不允许您与nil进行比较。

关键是我觉得创建unwrapped属性是不安全的,因为当你尝试使用nil值访问unwrapped属性时,代码可能会生成更多的运行时异常。但是,非可选值将使开发人员处理代码并初始化属性以避免这种情况。

所以有人可以告诉我哪些场景适合创建未包装的属性?

2 个答案:

答案 0 :(得分:3)

在某些情况下,在初始化对象时无法设置变量,但您或多或少保证在使用之前设置属性。其中一个例子是IBOutlet。它们是在创建视图控制器之后设置的,但在调用实例viewDidLoad之前。这就是为什么它们被标记为未包装的可选项。

另一种情况是您希望将某些数据传递给对象。假设您有一个视图控制器,它呈现由呈现视图控制器传递的信息。视图控制器可能具有属性var information: MyCustomObject!,因为您知道为了让视图控制器在屏幕上显示信息,必须设置此属性;但是,在创建视图控制器之前/不能设置该属性。您通常会从segue实例化视图控制器,然后在prepareForSegue:中设置属性。

当然可以在上面的示例中使用选项,但如果您知道可选项已设置,则可以像使用非选项一样保存大量if let ...(理论上,所有内容)可以声明为可选项,但为什么所有的检查都知道属性已设置?)。

答案 1 :(得分:2)

您的方法是正确的, 创建展开的属性是不安全的 ,因为如果您的展开值为nil,您的应用就会崩溃。为了避免你应该使用 if let关闭而不是检查== nil。例如

class C{
    var unwrapped : String?
    var nonOptional : String

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

var c = C(nonOptional: "hola")

if let value = c.unwrapped {
     /// value is not nil here 
}

HERE关于optionals

的精彩演讲