Swift中的单线程用于安全初始化@IBInspectables

时间:2014-07-24 10:58:09

标签: ios properties initialization swift

我喜欢XCode 6中的新@IBInspectable概念,我也非常喜欢确保Swift为iOS / OS X开发带来的类型安全的绝佳选择。

但在开发过程中我经常会做的很常见,因为所有这些都很新,我想找出最好的方法:它应 安全 简短 。这里的一个班轮很棒,因为那时一个班级的每个属性都会在一行内定义,这会(在我看来)使类更具可读性。

正如苹果公司所展示的那样,Swift是为了使安全性缩短而设计的(参见this video中的接下来的几秒钟),我认为它应该是可能的。这是我现在正在做的事情的一个例子:

import UIKit

@IBDesignable class CustomViewClass: UIView {

    @IBOutlet var iconImageView: UIImageView?
    @IBOutlet var separatorView: UIView?
    @IBInspectable var iconImage: UIImage? { didSet { self.iconImageView!.image = self.iconImage } }
    @IBInspectable var separatorColor: UIColor = UIColor.grayColor() { didSet { self.separatorView!.backgroundColor = self.separatorColor } }

    init(coder aDecoder: NSCoder!) {
        super.init(coder: aDecoder)
    }

}

简短 不是类型安全的 :例如self.iconImageViewnil,那么此代码将具有不安全的行为。从Swift我会期待这样的事情:

import UIKit

@IBDesignable class CustomViewClass: UIView {

    @IBOutlet var iconImageView: UIImageView?
    @IBOutlet var separatorView: UIView?
    @IBInspectable var iconImage: UIImage? { didSet { self.iconImageView?.image = self.iconImage } }
    @IBInspectable var separatorColor: UIColor = UIColor.grayColor() { didSet { self.separatorView?.backgroundColor = self.separatorColor } }

    init(coder aDecoder: NSCoder!) {
        super.init(coder: aDecoder)
    }

}

意识到self.iconImageView!已被self.iconImageView?所取代,我期望self.iconImageView?.image = self.iconImage做出类似这样的事情但在一行中:

if self.iconImageView? {
    self.iconImageView!.image = self.iconImage
}

有没有人有解决方案?或者目前这是不可能的,所以我们应该提出一个雷达?

1 个答案:

答案 0 :(得分:0)

XCode 6 Beta 5的发行说明如下:

  

?链接运算符也可用于有条件地分配   通过一个可选项,如果它有一个值:

 sequences["fibonacci"]?.append(0)
 sequences["fibonacci"]?[6] = 13
 sequences["perfect"]?[0] = 6
 // Does nothing because the sequence has no 'perfect' key
  

请注意,通过查找可选的属性   AnyObject不能变异。

这意味着我的预期方法应该从现在开始起作用:

@IBInspectable var iconImage: UIImage? { didSet { self.iconImageView?.image = self.iconImage } }