gpt4 book ai didi

swift - 来自枚举的类参数

转载 作者:行者123 更新时间:2023-11-28 09:44:24 27 4
gpt4 key购买 nike

我有一个关于如何一起使用枚举和类的问题。

考虑以下几点:

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 有一个 Int 的 rawValue 类型,那么 HeroParameters 将能够在事先不知道的情况下为所有这些创建默认值时间有多少。

这是有效的,因为一旦 rawValue 达到枚举的最大数量,Parameter(rawValue:) 将返回 nil,并且 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"

关于swift - 来自枚举的类参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37641172/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com