gpt4 book ai didi

swift - 如何编写接受 Array 或 ArraySlice 的函数?

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

我想做的是通过编写如下函数来解析(部分)二进制协议(protocol) (MQTT):

func readString(bytes: Array<UInt8> OR ArraySlice<UInt8>) -> (string: String?, remainingBytes: ArraySlice<UInt8>?)

我知道多态性,但我更希望有一个函数。

我写了一个函数(使用泛型),它接受 UnsignedIntegerTypeArrayArraySlice 但我只想要 UInt8 。这似乎是一件简单的事情,但到目前为止我还没有想出一个好的解决方案......

最佳答案

我会做的是,首先忘记返回类型,只考虑这个函数应该接受什么作为它的参数。特别是,考虑一下 Array 和 Slice 的共同点,并编写一个泛型来具体说明。它们都是 MutableCollectionTypeSliceable。基本上世界上没有其他东西是(也就是说,您可能会使用的其他东西)。

此外,您希望元素类型为 UInt8。

所以现在就这么说吧,泛型让你这么说:

func readString<T:MutableCollectionType 
where T:Sliceable, T.Generator.Element == UInt8>(bytes: T) {
// ...
}

这是一个测试:

let arr = [UInt8(1),UInt8(2),UInt8(3)]
readString(arr) // compiles
readString(arr[1...2]) // compiles

这个公式的一个好处是编译器会测试,如果可以的话,看看你是否在用合法的整数类型调用。例如,这个编译,因为所有的整数都是小的和积极的:

readString([1,2,3])

但这甚至无法编译,因为编译器知道负整数不能是 UInt8:

readString([-1,2,3])

关于swift - 如何编写接受 Array<UInt8> 或 ArraySlice<UInt8> 的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30539079/

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