CurrendData.location
初始化后,我希望CurrentData
得到它的随机值。我出现了以下代码:
struct CurrentData {
var size: (x: Int, y: Int)
var location: (x: Int, y: Int)
init(size: (x: Int, y: Int)) {
self.size = size
self.location = (getRandom(size.x), getRandom(size.y)) //error
}
private func getRandom (_ value:Int) -> Int {
return Int.random(in: 0...value-1)
}
}
但是我得到这个错误:“在初始化所有存储的属性之前使用'self'”。怎么解决?
答案 0 :(得分:3)
getRandom
是一个实例方法,因此在self
上被调用(但是,通过Swift,您可以在访问实例方法/属性时省略self
)。
如果希望能够从init
调用函数,则需要将其声明为static
方法而不是实例方法。然后,您可以通过写出类型名称(CurrentData
)或仅使用Self
来调用静态方法。
struct CurrentData {
var size: (x: Int, y: Int)
var location: (x: Int, y: Int)
init(size: (x: Int, y: Int)) {
self.size = size
self.location = (Self.getRandom(size.x), Self.getRandom(size.y))
}
private static func getRandom (_ value:Int) -> Int {
Int.random(in: 0...value-1)
}
}
答案 1 :(得分:2)
代替将getRandom定义为实例方法,将其定义为静态方法,然后通过类型名称(CurrentData
)或Self
引用它
struct CurrentData {
var size: (x: Int, y: Int)
var location: (x: Int, y: Int)
init(size: (x: Int, y: Int)) {
self.size = size
location = (Self.getRandom(size.x), Self.getRandom(size.y))
}
private static func getRandom (_ value:Int) -> Int {
Int.random(in: 0...value-1)
}
}
另一种解决方案是将您的location
属性定义为懒惰属性,然后可以访问self
,并且仅在代码中调用该位置后,该位置才会执行一次。
struct CurrentData {
var size: (x: Int, y: Int)
lazy var location: (x: Int, y: Int) = {
(getRandom(size.x), getRandom(size.y))
}()
init(size: (x: Int, y: Int)) {
self.size = size
}
private func getRandom (_ value:Int) -> Int {
Int.random(in: 0...value-1)
}
}