假设我们定义了一个类

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进行比较。

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

那么,谁能告诉我哪种方案适合创建未包装的属性?

最佳答案

在某些情况下,初始化对象时无法设置变量,但是可以保证在使用它们之前先设置好属性。一个示例是IBOutlet。它们是在创建视图控制器之后但在调用viewDidLoad之前设置的。这就是为什么将它们标记为未包装的可选内容的原因。

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

在上述示例中当然可以使用可选参数,但是如果您知道设置了可选参数,则可以像使用非可选参数一样节省很多if let ...(理论上,所有内容都可以声明为可选参数,但是为什么您所有的检查都知道该属性已设置?)。

07-24 14:04