代码:
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'可用之前运行
我该如何调试?
答案 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。