列挙型とクラスを一緒に使用する方法について質問があります。
次のことを考慮してください。
enum parameter {
case agility
case strength
case mind
}
struct heroParameters {
let maxInitialParam: UInt32! = 10
var agility: UInt32!
var strength: UInt32!
var mind: UInt32!
init() {
self.agility = arc4random_uniform(self.maxInitialParam)
self.strength = arc4random_uniform(self.maxInitialParam)
self.mind = arc4random_uniform(self.maxInitialParam)
}
}
class Hero {
var parameters: heroParameters!
required init() {
self.parameters = heroParameters()
}
func setParameter(parameterName: parameter, _ value: UInt32) {
// ?
}
}
私が持っている質問は、パラメータのリストを変更する必要がある場合に備えて、上記の列挙型から構造体変数のリストを適切に設定する方法はありますか?
一般に、すべて別々の列挙型にリストされている未知の量の変数で構成される構造体を初期化する方法はありますか?
いずれにせよ、私は完全に間違った方法で考えている可能性があり、これらを適切に処理する方法を理解する必要があります。
辞書を使用して、パラメータをに保存できますHeroParameters
。列挙Parameter
型のrawValueタイプをInt
、にHeroParameters
すると、事前にいくつあるかを知らなくても、すべての列挙型のデフォルト値を作成できます。
これが機能するのは、が最大数の列挙に達するParameter(rawValue:)
と戻り、ループが終了するためです。nil
rawValue
while
enum Parameter: Int {
case agility
case strength
case mind
}
struct HeroParameters {
let maxInitialParam: UInt32 = 10
var parameters = [Parameter: UInt32]()
init() {
var rawValue = 0
while let parameter = Parameter(rawValue: rawValue) {
parameters[parameter] = arc4random_uniform(maxInitialParam)
rawValue += 1
}
}
}
class Hero {
var parameters = HeroParameters()
func setParameter(parameterName: Parameter, _ value: UInt32) {
parameters.parameters[parameterName] = value
}
}
コメントでの@vadianの優れた提案に従って、Hero
添え字を使用してパラメーターを設定/取得する機能を使用してクラスを定義できます。
class Hero {
var parameters = HeroParameters()
subscript(key: Parameter) -> UInt32 {
get { return parameters.parameters[key]! }
set { parameters.parameters[key] = newValue}
}
}
次に、あなたは素晴らしいクリーンな解決策を持っています:
let hero = Hero()
hero[.agility] = 3
hero[.strength] = 7
print(hero[.strength]) // "7"
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加