繁体   English   中英

如何初始化此Swift枚举-甚至应该使用它?

[英]How do I initialise this Swift Enumeration - or should I even be using it?

我想通过读取包含八个参数值的文本文件来初始化Swift中的参数列表,并按照从文件中读取的顺序保存参数。 一旦初始化,参数值就不会改变。 理想情况下,应该有效地访问它们-对于任何维护代码的人都应该特别清楚。

在游乐场例( 下文 )参数值被存储在一个ArrayArraysStrings 然后,将Enumeration中的原始值用作一组索引以寻址Array 最初,我想到了使用Enumeration将参数值存储为原始值,以使用参数名称或数字索引进行寻址。 但是从这个答案中,我看不到将参数值直接分配给成员名称的方法。 实际上,我开始怀疑我是否应该使用枚举。

谁能提供更好的方法来做到这一点?

(这听起来很幼稚,因为我之前从未使用过Swift Enumeration )。

enum MapParameters: Int {
    case midiChannel                = 0,
    sizeOfRepeatingMapPattern       = 1,
    firstMIDIKey                    = 2,
    lastMIDIKey                     = 3,
    middleKey                       = 4,
    referenceMIDIKey                = 5,
    referenceFrequency              = 6,
    keysPerFormalOctave             = 7
    }

    let sourceArray = ["5", "12", "0", "127", "60", "69", "440.0", "12"]

    let mapIndex = MapParameters.referenceFrequency     //referenceFrequency
    let i = mapIndex.rawValue                           // 6
    let parameterValue  = sourceArray[i]                // "440.0"

使用MapParameters枚举确定sourceArray的每个索引的含义(使其更具可读性)是合法的,但是, sourceArray.count等于8并且其排序始终相同时,这应该是有效的。

您可以将其用作:

enum MapParameters: Int {
    case midiChannel                = 0,
    sizeOfRepeatingMapPattern       = 1,
    firstMIDIKey                    = 2,
    lastMIDIKey                     = 3,
    middleKey                       = 4,
    referenceMIDIKey                = 5,
    referenceFrequency              = 6,
    keysPerFormalOctave             = 7
}

let sourceArray = ["5", "12", "0", "127", "60", "69", "440.0", "12"]

let firstMIDKeyFromSource = sourceArray[MapParameters.firstMIDIKey.rawValue] // 0
let middleKeyFromSource = sourceArray[MapParameters.middleKey.rawValue] // 60

实际上,我发现上面代码的代码片段味道不好; 还有一些替代方法应该进行优化,例如:将这些值作为Dictionary接收,或者-如果必须以某种方式将它们作为数组获取,则可能希望通过一个简单的模型来映射它们,类似于:

struct MappedParameters {
    // you might want to give them initial values
    // or you can make them as optionals
    var midiChannel = ""
    var sizeOfRepeatingMapPattern = ""
    var firstMIDIKey = ""
    var lastMIDIKey = ""
    var middleKey = ""
    var referenceMIDIKey = ""
    var referenceFrequency = ""
    var keysPerFormalOctave = ""

    init(sourceArray: [String]) {
        if sourceArray.count  != 8 {
            fatalError("ERROR: sourceArray.count is NOT 8")
        }

        midiChannel = sourceArray[0]
        sizeOfRepeatingMapPattern = sourceArray[1]
        firstMIDIKey = sourceArray[2]
        lastMIDIKey = sourceArray[3]
        middleKey = sourceArray[4]
        referenceMIDIKey = sourceArray[5]
        referenceFrequency = sourceArray[6]
        keysPerFormalOctave = sourceArray[7]
    }
}

用法:

您应该在代码中的某处实现:

let sourceArray = ["5", "12", "0", "127", "60", "69", "440.0", "12"]
let sourceMapper = MappedParameters(sourceArray: sourceArray)

并简单地将sourceMapper用作:

print(sourceMapper.firstMIDIKey) // 0
print(sourceMapper.middleKey) // 60

希望这会有所帮助。

@Ahmad F的答案的替代方法是使用静态成员

struct MapParameters {
    static let midiChannel                     = 0
    static let sizeOfRepeatingMapPattern       = 1
    static let firstMIDIKey                    = 2
    static let lastMIDIKey                     = 3
    static let middleKey                       = 4
    static let referenceMIDIKey                = 5
    static let referenceFrequency              = 6
    static let keysPerFormalOctave             = 7
}

let sourceArray = ["5", "12", "0", "127", "60", "69", "440.0", "12"]

let parameterValue  = sourceArray[MapParameters.referenceFrequency]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM