gpt4 book ai didi

arrays - 将 Swift Array 的内容复制到 Struct embedded Tuple

转载 作者:搜寻专家 更新时间:2023-10-31 22:34:23 25 4
gpt4 key购买 nike

为了与 BLE 特征进行通信,我有一个 Swift 结构,如下所示:

struct Packet {
var control1:UInt8 = 0
var control2:UInt8 = 0
var payload:(UInt8,UInt8,UInt8,UInt8,UInt8,UInt8,UInt8,UInt8,UInt8,UInt8,UInt8,UInt8,UInt8,UInt8,UInt8,UInt8) = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)

init(control1:UInt8, control2:UInt8) {
self.control1 = control1
self.control2 = control2
}
}

我将 payload 定义为元组,因为这似乎是将固定大小的数组(在本例中为字节)嵌入 Swift 结构的唯一方法。冗长,但无论如何。

我有一个很大的 source:[UInt8],我想将其样本拉到 Packet 结构中,这样我就可以通过 BLE 将它们发送到远程设备。当我这样做时:

var packet = Packet(control1: self.pageIndex, control2: sentenceIndex)
let offset = (Int(self.pageIndex) * self.pageSize) + (Int(sentenceIndex) * self.sentenceSize)
let limit = offset + self.sentenceSize
packet.payload = self.source[offset..<limit]

对于最后一行,我得到了一个相当困惑的错误:

Cannot subscript a value of type '[UInt8]'

我说神秘,因为它确实可以。如果我将对 packet.payload 的赋值取出来,则下标该值没有问题。

在更高层次上,我真正感兴趣的是如何将结构与固定大小的字节数组放在一起,然后将大缓冲区的样本复制到其中。我想既了解以上内容,又想知道如何解决我的问题。

更新:

受以下两个答案的影响,我最终退缩了一点,并重新思考。我的主要驱动力是我想要一种简单/聪明的方法来将具有内部数组的结构转换为 NSData,这是 BLE 通信中的主要方法。我最终做的是:

struct Packet {
var pageIndex:UInt8 = 0
var sentenceIndex:UInt8 = 0
var payload:ArraySlice<UInt8> = []

var nsdata:NSData {
let bytes:[UInt8] = [self.pageIndex, self.sentenceIndex] + self.payload
return NSData(bytes: bytes, length: bytes.count)
}
}

不是最有效的,因为我必须创建中间 [UInt8] 数组,但我认为不存在简单的转换方法,我必须使用转换或 memcpy 和 friend 来做事情。

我不确定将下面两个中的哪一个标记为答案,因为它们都影响了我的最终结果。

最佳答案

有两个丑陋/简单的解决方案:

  • 分别分配元组的每个成员:

    var offset = ...
    packet.payload = (source[offset++], source[offset++], ... , source[offset++])
  • 只复制原始内存(推荐)

    var values = Array(source[offset..<limit])
    memcpy(&packet.payload, &values, sentenceSize)

请注意,可以从元组创建数组:

func tupleToArray<T>(tuple: Any, t: T.Type) -> [T] {
return Mirror(reflecting: tuple).children.flatMap{ $0.value as? T }
}

tupleToArray((1, 2, 3, 4, 5), t: Int.self) // [1, 2, 3, 4, 5]

但反过来就不行了,因为 Swift 的反射是只读的。

另一个更复杂但更漂亮的解决方案是使用 Dependent Types ,这使您能够拥有编译时已知长度的数组。查看this great blog post ,其中他还提到了 this post on the Apple Developer forums这基本上就是您所需要的:

let vector = 3.0 ⋮ 4.0 ⋮ 5.0    // [3.0, 4.0, 5.0]
vector[1] // 4.0
vector.count // 3
sizeofValue(vector) // 3 * 8 ( same size as a tuple with 3 elements)

关于arrays - 将 Swift Array 的内容复制到 Struct embedded Tuple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33248560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com