Swift无法在属性初始化程序中使用实例成员

时间:2019-06-26 18:50:29

标签: ios swift

我想在课堂上做这样的事情,但是Swift不允许这样做:

 let minDelay = Float(0.05) //Like #define minDelay 0.05 in Objective-C

 private var delay = minDelay

我收到一个错误“无法在属性初始化程序中使用实例成员minDelay”。在不初始化init或其他变量的情况下,纠正此错误的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用静态变量(这意味着有一个属于该类型的实例):

class MyClass {

    static let minDelay: Float = 0.05
    // You can write `Self.minDelay` starting in Swift 5.1
    private var delay = MyClass.minDelay 

}

有很多方法可以解决此问题,但这可能与您提到的#define最接近。您也可以在类之外完全定义minDelay,但是我认为这没有意义,因为它仅与此类相关。

答案 1 :(得分:2)

Swift的属性初始化器无法引用其他属性。

struct S {
    let a = 0
    let b = a // ❌
}
  

错误:无法在属性初始化程序中使用实例成员a;属性初始化程序在self可用之前运行

这是一种尝试防止这样的循环定义的方法:

struct S {
    let a = b
    let b = a //❓what would these values even be?
}

诸如Java之类的某些语言采用了更宽容的方法,即让成员引用其上方的任何成员(即,在其上方的一行),形成互连成员定义的directed acyclic graph

Swift采取更严格的方法,并彻底禁止它。要解决此问题,您可以:

  1. 将您的minDelay变量移至其他位置。

    • 将其设为静态成员
    • 将其设为其他类型的静态成员(例如,FooConstants小写的枚举)。
    • 将其移动到全局变量(请勿这样做)
  2. 按照您的说法将其设为lazy var

  3. 在初始化器中设置其值,在初始化器中明确表示分配的顺序。