枚举中的类参数

0 enums struct swift

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

考虑以下:

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) {
         // ?
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:有没有办法从上面的枚举中正确设置结构变量列表,以防需要修改参数列表?

一般来说,有没有办法初始化一个由未知数量的变量组成的结构,所有变量都在单独的枚举中列出?

无论哪种方式,我可能会以完全错误的方式思考,我需要了解如何正确使用这些方法.

vac*_*ama 5

您可以使用字典来存储参数HeroParameters.如果你使你的枚举Parameter具有rawValue类型Int,那么HeroParameters将能够为所有这些创建默认值,而无需提前知道有多少.

这是有效的,因为一旦达到最大枚举数Parameter(rawValue:)就会返回,循环将结束.nilrawValuewhile

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
    }
}
Run Code Online (Sandbox Code Playgroud)

按照@ vadian在评论中的出色建议,您可以Hero使用下标来设置/获取参数:

class Hero {
    var parameters = HeroParameters()

    subscript(key: Parameter) -> UInt32 {
        get { return parameters.parameters[key]! }
        set { parameters.parameters[key] = newValue}
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,你有一个很好的清洁解决方案:

let hero = Hero()

hero[.agility] = 3
hero[.strength] = 7

print(hero[.strength])  // "7"
Run Code Online (Sandbox Code Playgroud)