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,他给出了改进的提示。请看我更改的答案。