我想尝试在纯swift中实现消息包。一切顺利,直到我来到Array。
我采用的方法是实现一个名为MsgPackMarshable
的协议,扩展了原始类型:
//Protocol
protocol MsgPackMarshable{
func msgpack_marshal() -> Array<Byte>
}
//Implementation for some types
extension UInt8 : MsgPackMarshable{
func msgpack_marshal() -> Array<Byte>{
return [0xcc, self]
}
}
extension UInt16 : MsgPackMarshable{
func msgpack_marshal() -> Array<Byte>{
let bigEndian: UInt16 = self.bigEndian
return [0xcd, Byte((bigEndian & 0xFF00) >> 8), Byte(bigEndian & 0x00FF)]
}
}
extension UInt32 : MsgPackMarshable{
func msgpack_marshal() -> Array<Byte>{
let bigEndian: UInt32 = self.bigEndian
return [0xce, Byte((bigEndian & 0xFF000000) >> 24), Byte((bigEndian & 0xFF0000) >> 16), Byte((bigEndian & 0xFF00) >> 8), Byte(bigEndian & 0x00FF)]
}
}
我有一些问题延伸Array
。我想动态验证数组的类型是否正在实现MsgPackMarshable
协议:
extension Array: MsgPackMarshable{
func msgpack_marshal() -> Array<Byte>{
for item in self{
//How to check type here?
}
return []
}
}
由于Array
是swift中的结构,我想避免重新定义嵌入数组的新类型Array<MsgPackMarshable>
。