懒惰的可选属性总是零?

时间:2014-06-25 05:35:52

标签: swift

以下代码是否总是打印出nil?

class Foo
{
    @lazy var bar: Int? = 5
}

println(Foo().bar)

我认为当访问bar属性时,它将被初始化为5。

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!
    }
}