我希望在一个结构体中有一个可重用的函数,我可以在我的init方法中调用它。然而,当我这样做时,我得到了下面的错误。
在初始化所有存储的属性之前使用了“self”
如何在init
方法中使用calculateValue
而不引发此错误?我将在结构体的其他部分使用calculateValue
函数,因此我不希望它存在于init
函数中。
struct Card {
let face: Face
let suit: Suit
let value: Int
init(face: Face, suit: Suit) {
self.face = face
self.suit = suit
self.value = self.calculateValue(face: face)
}
private func calculateValue(face: Face) -> Int {
if face == Face.two { return 2 }
if face == Face.three { return 3 }
if face == Face.four { return 4 }
if face == Face.five { return 5 }
if face == Face.six { return 6 }
if face == Face.seven { return 7 }
if face == Face.eight { return 8 }
if face == Face.nine { return 9 }
return 10
}
}
4条答案
按热度按时间blpfk2vs1#
我能想到两个可能的解决办法。
1.使
calculateValue
成为静态函数,因为它不依赖于任何状态。1.将返回值的功能移到
Face
枚举中。下面是使用计算的value
属性对Face
枚举进行的部分猜测:那么
Card
就变成了:尽管现在您甚至不需要
value
属性,或者您可以将其设置为计算属性。55ooxyrt2#
我的建议是用
Int
原始值声明枚举,只要分配初始原始值就足够了,编译器就会推断出序列在
Card
中,用computed属性得到一个值,如果小于10,则返回face
的原始值,否则为10。init方法是免费的。
dwbf0jvd3#
把它移到
Face
本身怎么样,例如..那么你的姓名首字母可以是...
fumotvh34#
让我再提一个建议:只需让
Face
值具有Int
原始值:这时,你可以只设置
self.value = face.rawValue
,但是你不应该这样做,因为你会有一个分离的真值源,Card
结构体不需要值的副本,它们只需要访问面的值,它们已经包含了: