Ios 为swift中的数据创建高级变量扩展
我想在数据中添加不同的字节存储类型,如Ios 为swift中的数据创建高级变量扩展,ios,swift,Ios,Swift,我想在数据中添加不同的字节存储类型,如Int8、Int16、Int32、…。它变得非常复杂,因为每次我都必须逐个转换为数据并附加相同的内容 如何为以任意顺序接受Int8、Int16、Int16、Int32并返回字节的数据创建扩展名 通常,下面的代码应该可以工作。我试过了,但没成功。无法完成扩展方法 let value1: Int8 = 0x01 let value2: Int16 = 0x0001 let value3: Int32 = 0x00000001 let data = Data.g
Int8、Int16、Int32、…
。它变得非常复杂,因为每次我都必须逐个转换为数据并附加相同的内容
如何为以任意顺序接受Int8、Int16、Int16、Int32
并返回字节的数据创建扩展名
通常,下面的代码应该可以工作。我试过了,但没成功。无法完成扩展方法
let value1: Int8 = 0x01
let value2: Int16 = 0x0001
let value3: Int32 = 0x00000001
let data = Data.getBytes(value1, value2, value3)
extension Data {
static func getBytes(...) -> Data {
// How to proceed?
}
}
首先,您需要一个被
getBytes
接受的公共类型。不幸的是,我们不能直接使用FixedWidthInteger
,因为它包含Self
约束。我们也不能将FixedWidthInteger
用作泛型参数,因为这样我们就不能在单个调用中混合使用Int8
和Int16
等等
因此,我建议引入一个新的协议MyIntType
,而不是使用Any
,并让您想要支持的所有类型实现这一点:
protocol MyIntType {
// ...
}
extension Int8: MyIntType { }
extension Int16: MyIntType { }
extension Int32: MyIntType { }
extension Data {
static func getBytes(_ values : MyIntType...) -> Data { /* ... */ }
}
在getBytes
中,您需要从具体的Int类型访问内部字节,例如调用类似的数据(bytes:&intValue,count:MemoryLayout.size)
。幸运的是,Int8
等支持类似于bitWidth
(类似于MemoryLayout
)的内容,因为它们都符合FixedWidthInteger
协议
然而,我们不能在getBytes
函数中直接使用FixedWidthInteger
,因为它包含Self
约束
作为解决方法,我们只需要将bitWidth
属性添加到MyIntType
协议中:
protocol MyIntType {
var bitWidth:Int { get }
}
所有那些Int
x类型都已经实现了它,因此我们不需要对它们进行扩展,只需在getBytes
中使用它即可:
extension Data {
static func getBytes (_ values:MyIntType...) -> Data {
var d = Data()
for var v in values {
let data = Data(bytes:&v, count:v.bitWidth / 8)
d.append(contentsOf:data)
}
return d
}
}
现在我们可以检查它:
let value1: Int8 = 0x01
let value2: Int16 = 0x0010
let value3: Int32 = 0x00000100
let bytes = Data.getBytes(value1, value2, value3)
print (bytes)
for b in bytes {
print (b)
}
是的,但是没有一个是有用的,因为它们都是自约束的:-)并且你不会得到
数据
接口,让每个人用自我
扩展名FixedWidthInteger
,数据(字节:&int,计数:self.bitWidth/8)
是的,但是当使用它作为函数参数时,您得到错误:协议“FixedWidthInteger”只能用作泛型约束,因为它具有自身或关联的类型要求
——而这正是我将某些内容踢出的时刻。@AndreasOetjen此代码工作正常。我们有什么办法可以简化这一点吗?是的,感谢@Sulthan,他给出了改进的提示。请看我更改的答案。