2017-04-21 31 views
5

似乎我遇到了不应该出现的问题......但我想请求一些帮助。属性初始值设定项在“自我”可用之前运行

这里有一些关于堆栈的解释,我没有得到。

有两个简单的类,其中一个指向另一个,如下所示;

class User { 
    lazy var name: String = "" 
    lazy var age: Int = 0 

    init (name: String, age: Int) { 
     self.name = name 
     self.age = age 
    } 
} 

class MyOwn { 
    let myUser: User = User(name: "John", age: 100) 
    var life = myUser.age 
    //Cannot use instance member 'myUser' within property initializer 
    //property initializers run before 'self' is available 
} 

我收到了注释的编译错误。请有人告诉我该怎么办才能解决这个案子?

非常感谢任何好人帮忙!

+2

将代码放入方法中。您无法初始化在类的顶层依赖于对方的属性。或者使用计算属性。 Btw:User类中的'lazy'属性是无用的。 – vadian

+0

@vadian,谢谢你的帮助。 – RafalK

回答

5

由于正确地vadian指出你应该建立在这样的情况下的init

class MyOwn { 
    let myUser: User 
    var life: Int 

    init() { 
     self.myUser = User(name: "John", age: 100) 
     self.life = myUser.age 
    } 
} 

您不能提供该另一个实例属性取决于存储属性的默认值。

+1

这一个肯定会解决我的问题。谢谢! – RafalK

+0

不客气!祝你的应用程序好运;-) –

2

你应该申报的生活是这样的:

lazy var life:Int = { 
    return self.myUser.age 
}() 

因为你想在初始化过程中,初始化一个属性(变量)与另一个。此时变量尚不可用。

+0

应该可以正常工作,但不会使用'lazy'来解决这个问题? ;-) –

+1

@PauloMattos在你的答案中提出的代码架构更加可以接受,至少对我而言。但我不能说为什么一个人需要他试图实施的架构。我只是向他展示了如何在没有编译错误的情况下做到这一点,并解释了什么是他的错误 –

相关问题