属性初始化程序在 'self' 可用之前运行
Posted
技术标签:
【中文标题】属性初始化程序在 \'self\' 可用之前运行【英文标题】:Property initializers run before 'self' is available属性初始化程序在 'self' 可用之前运行 【发布时间】:2017-09-18 22:25:54 【问题描述】:似乎我遇到了一些不应该出现的问题......但我想寻求帮助。
这里有一些关于堆栈的解释我不明白。
有两个简单的类,其中一个引用另一个,如下所示:
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
我收到注释编译错误。有人可以告诉我应该怎么做才能解决这个问题吗?
【问题讨论】:
将代码放入方法中。您不能在类的顶层初始化相互依赖的属性。或者使用计算属性。顺便说一句:User
类中的 lazy
属性是无用的。
@vadian,感谢您的帮助。
这是swift
中令人惊讶的限制:有什么想法为什么会这样?
【参考方案1】:
正如 vadian 正确指出的那样,您应该在这种情况下创建一个 init
:
class MyOwn
let myUser: User
var life: Int
init()
self.myUser = User(name: "John", age: 100)
self.life = myUser.age
您不能为依赖另一个实例属性的存储属性提供默认值。
【讨论】:
这个肯定能解决我的问题。谢谢! 为什么我们可爱的 IDE 不提出这个?【参考方案2】:你应该这样声明生活:
lazy var life:Int =
return self.myUser.age
()
因为您在初始化过程中试图用另一个属性(变量)初始化。目前还没有可用的变量。
【讨论】:
应该可以正常工作,但使用lazy
是不是有点矫枉过正? ;-)
@PauloMattos 您的答案中提出的代码架构更容易接受,至少对我而言。但我不能说为什么一个人需要他试图实现的架构。我只是向他展示了如何在没有编译错误的情况下做到这一点并解释了他的错误以上是关于属性初始化程序在 'self' 可用之前运行的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI Maps - 不能在属性初始化器中使用实例成员;属性初始化程序在 'self' 可用之前运行
如何修复错误:@FetchRequest 中的“属性初始化程序在”自我“可用”之前运行
不能在属性初始化器中使用实例成员“pdfName”;属性初始化程序在“自我”可用之前运行
SwiftUI CS193P - 不能在属性初始化程序中使用实例成员“卡片”;属性初始化程序在“自我”可用之前运行