执行以下操作:
创建一个名为A
的类,UITableViewCell
的子类:
class A: UITableViewCell {
var isChosen: Bool = true
}
创建一个xib文件并将UITableViewCell
对象拖动为顶级对象,并确保将其类设置为A
:
创建A
的实例:
var a = NSBundle.mainBundle().loadNibNamed("A", owner: nil, options: nil)[0] as A
打印isChosen
:
println(a.isChosen)
输出:
false
为什么会这样?它只在从笔尖初始化实例时发生。
即使您将变量声明为可选项并将其设置为nil
:
var isChosen: Bool! = nil
答案 0 :(得分:4)
由于您的类A
没有定义任何init方法,因此swift自动为您生成默认初始值设定项。使用默认init()
方法代码var isChosen: Bool = true
是一个快捷方式:
class A: UITableViewCell {
var isChosen: Bool
init() {
isChosen = true
}
}
当您从Nib创建类型为A
的自定义单元格时,自动生成的init()
方法不会被调用,因为initWithCoder
调用因此isChosen
值为false
}。
<强>更新强>
正如@MattGibson在对该问题的评论中所提到的,通过 xCode 6 Beta 5 更新,我们可以解决这个问题。可以通过添加init with coder
初始化程序并根据需要对其进行标记来解决,因此A
应包含以下代码:
required init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
它是如何工作的?从Beta 5发行说明:
在每个子类实现之前编写必需的修饰符 必需的初始化程序。可以满足所需的初始化程序 自动继承初始化器。
<强>更新强>
只有在您的班级中至少覆盖一个required init(coder aDecoder: NSCoder!) { ... }
方法时,才应添加 init
。