以下代码是否总是打印出nil?
class Foo
{
@lazy var bar: Int? = 5
}
println(Foo().bar)
我认为当访问bar属性时,它将被初始化为5。
答案 0 :(得分:1)
清除为什么要这样做,这里的问题是你需要提供一个惰性属性,它可以在第一次调用时使用它。编写上述代码的正确方法是:
class Foo {
lazy var bar = Int(5)
}
print(Foo().bar)
答案 1 :(得分:0)
因为bar包含在一个可选项中。您需要先打开它才能使用它。与...一起!运算符或if语句。
编辑:
将@lazy
与原生类型一起使用时似乎存在错误。请参阅this问题。
请记住,Swift尚未达到1.0,因此编译器可能会出现一些错误,并且语言可能会发生变化。
答案 2 :(得分:0)
与Xcode6beta-3一样,这个bug已经被修复了#34;并引入了一个新的"功能"
$ swift
Welcome to Swift! Type :help for assistance.
1> class Foo { @lazy var bar: Int? = 5 }
2> var f = Foo()
f: Foo = {
bar.storage = nil
}
3> f.bar
$R0: Int? = 5 // working good
4> f.bar = nil // use new "feature" to reset bar
5> f
$R2: Foo = {
bar.storage = nil
}
6> f.bar
$R3: Int? = 5 // not sure is this what I want
7>
f.bar
现在确实为您提供了5
。它还引入了一个"功能"允许您通过为@lazy
分配nil
来取消初始化f.bar
变量。然后,下次您致电5
时,会再次为您提供{{1}}。
答案 3 :(得分:0)
仅供参考:在Xcode 6.1.1中,以下代码
class Foo
{
lazy var bar: Int? = 5
}
var foo = Foo ()
println(foo.bar)
foo.bar = 6
println(foo.bar)
foo.bar = nil
println(foo.bar)
foo.bar = 7
println(foo.bar)
产生输出
Optional(5)
Optional(6)
nil
Optional(7)
应该如此。
答案 4 :(得分:0)
我认为你不需要有一个带有初始值的懒惰可选属性(在我看来)。我建议使用计算属性。
如果您希望它是只读属性:
var bar: Int {
return 5
}
否则
var bar: Int? {
get {
return 5
}
set {
bar = newValue!
}
}