swift中的可选属性

时间:2015-03-23 17:38:39

标签: swift properties optional

如果我有以下财产:

var animatedImagesView:JSAnimatedImagesView?

最终它会在适当的时间进行初始化,当我想对其进行操作时,是否需要继续使用!来解开它?例如:

self.animatedImagesView!.reloadData()

通常我解开选项如:

 if let dailySleepTime:AnyObject = uw_JSON["daily_sleep_time"] {
    self.settings.dailySleepTime = dailySleepTime as String
 } else {
    log.warning("\n Error finding attr in \(request)\n")
 }

但我不能以同样的方式将我的属性转换为常量吗?我没有抱怨,我只是想知道我是否正确使用感叹号。

3 个答案:

答案 0 :(得分:2)

一个选项是将animatedImageView定义为隐式解包的可选开头:

var animatedImagesView: JSAnimatedImagesView!

这在Interface Builder中处理Cocoa .nib对象时很常见,因为View在从.nib中取消归档之前无法初始化,但是你知道在使用它之前它总会被初始化。

我讨厌使用!,因为它只是等待发生的运行时错误,但IB对象是少数几个使用它似乎合法且必要的地方之一。否则,你的其他两个选项就是你已经找到的选项 - 每次使用if let...展开它(这是最安全的,但a **中的痛苦),或者每次都使用!您使用它,这不比仅使用!声明它更安全。

答案 1 :(得分:0)

相反,请将其声明如下:

          var animatedImagesView:JSAnimatedImagesView!

隐式展开的可选将不再需要经常" bang"取消引用它,但要确保它在任何时候都不会是零。

这是指定您知道的IBOutlet的好方法,在您使用之前,它们将始终从笔尖或故事板初始化。

答案 2 :(得分:0)

如果在正确的时间初始化它(例如在任何生命周期方法中或在构造函数中),则可以使用!而不是?来进行属性声明。我自己通常只使用?来获取我不一定知道在我的生命周期中始终具有价值的东西。

如果您也是如此,则需要继续使用?,因为您无法保证存储值。如果对变量进行多次调用,则还应使用if let myVar = myVar { .. }语法。