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

标签 swift

执行以下操作:

创建一个名为 A 的类,它是 UITableViewCell 的子类:

class A: UITableViewCell {
    var isChosen: Bool = true
}

创建一个 xib 文件并拖动一个 UITableViewCell 对象作为顶级对象,并确保将其类设置为 A:

enter image description here enter image description here

创建 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/

相关文章:

SwiftUI 如何从所有 View 中查看类

ios - 设置回原来的ui布局约束——放大动画

ios - Xcode 添加多个字符串消息正文

Swift TextView 不在文本顶部

ios - 主视图未使用详细 View 中的委托(delegate)进行更新

ios - 是否可以在触发 CLRegion 后监控航向/航向?

swift - 如何在 Swift 中从字符集中获取随机元素

ios - 实时获取 Apple Watch 心率变异性 SDNN?

ios - Swift - 使用 FireBase 登录 - 登录后无法检索用户数据

arrays - 如何修复 JSON 解析应用程序中的 'Index Out Of Range' 错误