执行以下操作:
创建一个名为 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
为什么会这样?它仅在您从 nib 初始化实例时发生。
即使您将变量声明为可选变量并将其设置为nil
:
var isChosen: Bool! = nil
它会仍然以某种方式设置为false
。
最佳答案
因为你的类 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
initializer 并将其标记为 required 来解决,因此 A
应包含以下代码:
required init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
它是如何工作的?来自 Beta 5 发行说明:
The required modifier is written before every subclass implementation of a required initializer. Required initializers can be satisfied by automatically inherited initializers.
更新:
required init(coder aDecoder: NSCoder!) { ... }
仅当您覆盖类中的至少一个 init
方法时才应添加。
关于swift - 显式设置 true Bool 以某种方式设置为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25087312/