为了将我的代码放在SO而不是Pastebin上,这里是我的观察。当使用可选数组在从Objective C类派生的Swift类中时,这似乎是某种bug或意外行为。如果使用纯Swift类,则可以按预期工作。
class Foo {
var weekSelections: Array<Bool>!
func test() {
weekSelections = Array<Bool>(count: 10, repeatedValue: false)
weekSelections[0] = true;
println(weekSelections[0])
}
}
var foo = Foo()
foo.test()
然而,如果您从NSObject派生出Foo:
import Foundation
class Foo : NSObject {
var weekSelections: Array<Bool>!
func test() {
weekSelections = Array<Bool>(count: 10, repeatedValue: false)
weekSelections[0] = true;
println(weekSelections[0])
}
}
var foo = Foo()
foo.test()
即使在这种情况下,如果您在初始化器中进行weekSelections的初始化,它也可以正常工作:
class Foo : NSObject {
var weekSelections: Array<Bool>!
init() {
weekSelections = Array<Bool>(count: 10, repeatedValue: false)
weekSelections[0] = true;
println(weekSelections[0])
}
}
var foo = Foo()
个人而言,我认为这是一个bug。我在任何文档中都找不到任何解释从NSObject派生时行为差异的内容。
我也没有看到任何说明可选数组属性将是不可变的。考虑到“不可变”数组实际上在Swift中是可变的,这将特别奇怪,例如:
// Use "let" to declare an "immutable" array
let weekSelections = Array<Bool>(count: 10, repeatedValue: false)
weekSelections[0] = true
println(weekSelections[0])
... 目前文档中所述的方法可以正常运行,即使看起来有点奇怪。
个人建议您使用任何解决方法,并向苹果提出错误报告,以获取他们能提供的帮助。
loadView()
移动到init()
调用中,它就可以工作了。仍在努力弄清楚发生了什么。 - Matt Gibson