在结构中初始化所有存储的属性之前使用“自我”

时间:2020-10-05 11:26:13

标签: swift struct initialization

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'”。怎么解决?

2 个答案:

答案 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)
    }
}