Ios Swift:基于另一个具有lazy关键字的属性定义属性?

Ios Swift:基于另一个具有lazy关键字的属性定义属性?,ios,swift,Ios,Swift,,建议使用lazy标记属性,以便根据其他属性定义它们。这看起来很干净,比其他SO答案的建议更可取 但是,遵循此建议仍会生成错误消息:实例成员不能用于类型错误 定义教程以便在使用惰性时可以包含其他属性的正确方法是什么 class TestViewController: UIViewController { let Key1 = "Key1" let Key2 = "Key2" lazy var tutorial = [Key1, Key2] } 创建这个简单的类来测试@d

,建议使用
lazy
标记属性,以便根据其他属性定义它们。这看起来很干净,比其他SO答案的建议更可取

但是,遵循此建议仍会生成错误消息:
实例成员不能用于类型错误

定义
教程
以便在使用
惰性
时可以包含其他属性的正确方法是什么

class TestViewController: UIViewController {
    let Key1 = "Key1"
    let Key2 = "Key2"
    lazy var tutorial = [Key1, Key2]
}
创建这个简单的类来测试@dfri的建议,但是错误仍然发生:

import Foundation

class Test  {
    let Foo = "foo"
    lazy var bar = Foo
}

可能我不太理解你,但你是在寻找下面这样的东西吗

class Foo {
    let Key1 = "Key1"
    let Key2 = "Key2"
    lazy var tutorial : [String] = { [self.Key1, self.Key2] }()
    /* Alternatively:
    lazy var tutorial : [String] = [self.Key1, self.Key2] */
    init() {}
}
请注意,我正在使用前缀
.self
访问相同的类属性


或者,只需使用计算属性。在上面的简单示例中,
Key1
Key2
是不可变的,因此没有理由让tutorial成为一个懒惰的、存储的属性:

class Foo {
    let Key1 = "Key1"
    let Key2 = "Key2"
    /* now as a computed property: */
    var tutorial : [String] { return [Key1, Key2] }
    init() {}
}
但是,如果
Key1
Key2
是可变的,则上述两种解决方案将有所不同:

  • lazy var tutorial
    将使用当时的
    Key1
    Key2
    的当前值进行延迟初始化(首次使用时),但不会受到
    Key1
    和/或
    Key2
    中以后更改的影响
  • 但是,如果将
    tutorial
    作为计算属性,则始终会生成一个(计算的)数组,其中包含
    Key1
    和/或
    Key2
    的当前值

编辑添加(编辑问题后):

对于您问题中更新的示例,lazy变量的使用方式与上述相同:

class TestViewController: UIViewController {
    let Key1 = "Key1"
    let Key2 = "Key2"
    lazy var tutorial : [String] = [self.Key1, self.Key2]

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

两者都会导致此错误:“NSObject->()->ViewController”类型的值没有成员“Key1”。还有,为什么必须使用
self
?上面的示例不应产生当前形式的错误。然而,在您的特定示例中(您在问题中没有向我们展示),听起来好像您试图在闭包中使用惰性变量?可能会在你的问题中添加更多关于你具体问题的上下文。惰性变量仅用于类或结构属性。它在ViewController类中使用并定义为类属性,将随更多上下文更新,但基本上正如您在本答案中所猜测的。刚刚更新的问题。@Crashalot您确定您展示的示例反映了您试图实现的内容(这会给您带来错误)。我在上面答案的底部添加了一个编辑来回答您更新的示例。是的。不确定发生此错误的原因,将进一步调查。所以你的代码和我的代码之间唯一的区别就是使用了
self
?为什么这是必要的呢?