swift – 显式设置为true Bool以某种方式设置为false

请执行下列操作:

创建一个名为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

某种程度上它仍然会被设置为假.

由于您的类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并根据需要进行标记解决,因此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.

更新:

必须添加必需的init(编码器aDecoder:NSCoder!){…}只有在你的类中至少覆盖一个init方法时才会添加.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...