使用语句用于写入元组

时间:2017-10-27 09:47:21

标签: swift for-loop tuples

我使用此代码发送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

2 个答案:

答案 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)