我想在课堂上做这样的事情,但是Swift不允许这样做:
let minDelay = Float(0.05) //Like #define minDelay 0.05 in Objective-C
private var delay = minDelay
我收到一个错误“无法在属性初始化程序中使用实例成员minDelay”。在不初始化init或其他变量的情况下,纠正此错误的最佳方法是什么?
答案 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采取更严格的方法,并彻底禁止它。要解决此问题,您可以:
将您的minDelay
变量移至其他位置。
FooConstants
小写的枚举)。按照您的说法将其设为lazy var