假设我们定义了一个类
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 ...
(理论上,所有内容都可以声明为可选参数,但是为什么您所有的检查都知道该属性已设置?)。