[英]How do I initialise this Swift Enumeration - or should I even be using it?
我想通过读取包含八个参数值的文本文件来初始化Swift中的参数列表,并按照从文件中读取的顺序保存参数。 一旦初始化,参数值就不会改变。 理想情况下,应该有效地访问它们-对于任何维护代码的人都应该特别清楚。
在游乐场例( 下文 )参数值被存储在一个Array
的Arrays
的Strings
。 然后,将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.