我使用此代码发送midi sysEx。它非常适合发送“修复”数据,但现在我需要发送不同大小的数据。
var midiPacket:MIDIPacket = MIDIPacket()
midiPacket.length = 6
midiPacket.data.0 = data[0]
midiPacket.data.1 = data[1]
midiPacket.data.2 = data[2]
midiPacket.data.3 = data[3]
midiPacket.data.4 = data[4]
midiPacket.data.5 = data[5]
//...
//MIDISend...
现在假设我有一个字符串名称“TROLL”,但名称可以更改。 我需要这样的东西:
var name:String = "TOTO"
var nameSplit = name.components(separatedBy: "")
var size:Int = name.count
midiPacket.length = UInt16(size)
for i in 0...size{
midiPacket.data.i = nameSplit[i]
}
//...
//MIDISend...
但是这段代码不起作用,因为我不能像元组一样使用“i”。 如果有人知道该怎么做。
提前致谢。 KasaiJo
答案 0 :(得分:4)
C数组作为元组导入Swift。但是Swift编译器
保留导入的C结构(source)的内存布局,因此您可以重新绑定指向元组的指针
指向UInt8
的指针:
withUnsafeMutablePointer(to: &midiPacket.data) {
$0.withMemoryRebound(to: UInt8.self, capacity: MemoryLayout.size(ofValue: midiPacket.data)) {
dataPtr in // `dataPtr` is an `UnsafeMutablePointer<UInt8>`
for i in 0..<size {
dataPtr[i] = ...
}
}
}
答案 1 :(得分:1)
我不知道任何正确的方法,因为元组是复合类型,无法扩展以添加其他功能。
我可以考虑改进它的一种方法是将它提取到如下的函数:
func setMidiPacket(_ midi: MIDIPacket fromArray array: [ProbablyInt]) {
midiPacket.length = 6
midiPacket.data.0 = data[0]
midiPacket.data.1 = data[1]
midiPacket.data.2 = data[2]
midiPacket.data.3 = data[3]
midiPacket.data.4 = data[4]
midiPacket.data.5 = data[5]
}
setMidiPacket(midi, data)