不能在属性初始值设定项中使用实例成员'ie'

时间:2017-11-29 10:17:27

标签: swift swift4

代码:

class man: human {
    var ie = "ie/1/3/1///"
    let pe = "pe/1/3/3///"
    let ol = "ol/1/1/1///"
    let sejong = "sejong/3/1/1///"
    let gong = "gong/1/1/1///"
    let mans = [ie, pe, ol, sejong, gong]
}

错误:

  

Col 15:不能在属性初始化器中使用实例成员'ie';   属性初始化程序在'self'可用之前运行

我该如何调试?

1 个答案:

答案 0 :(得分:3)

在非延迟初始化彼此时,不能使用实例变量。

考虑您的代码时要考虑以下事项:您定义和初始化变量的顺序无关紧要。从您的(开发人员)角度来看,它们都将同时初始化(当然,它们不是从低级别的角度来看)。

这意味着当你写:

let mans = [ie,pe,ol,sejong,gong]  

你基本上告诉编译器组成一个尚未初始化的数组。进行此分配时,阵列的所有成分都不存在。

常见的解决方案是进行初始化 - 依赖于其他实例变量的初始化 - lazy

class man {
    var ie = "ie/1/3/1///"
    let pe = "pe/1/3/3///"
    let ol = "ol/1/1/1///"
    let sejong = "sejong/3/1/1///"
    let gong = "gong/1/1/1///"
    lazy var mans : [String] = {
         [ie,pe,ol,sejong,gong]
    }()
}

与普通变量不同,惰性变量在首次使用此变量时获得其值,但在创建对象后不会立即获得。你告诉编译器:我不是要立即组成一个数组,但是在我第一次使用这个变量之后,在创建了一个对象之后让我成为一个数组:

let theMan = man()

在此阶段,theMan.mans属性尚未初始化。但是,只要执行基本操作就足够了,比如打印:

print(theMan.mans)

初始化此属性。这称为延迟初始化,这是在初始化时组成由其他实例变量组成的数组的方法。当然,您应该记住,任何相关数据都可能被修改并影响init。