Arrays Swift扩展确定的泛型类型,而不使用objc绑定
我想尝试在纯swift中实现messagepack。在我来到Array之前,一切都很顺利 我的方法是实现一个名为MsgPackMarshable的协议,它扩展了primitiv类型:Arrays Swift扩展确定的泛型类型,而不使用objc绑定,arrays,generics,dictionary,swift,Arrays,Generics,Dictionary,Swift,我想尝试在纯swift中实现messagepack。在我来到Array之前,一切都很顺利 我的方法是实现一个名为MsgPackMarshable的协议,它扩展了primitiv类型: //Protocol protocol MsgPackMarshable{ func msgpack_marshal() -> Array<Byte> } //Implementation for some types extension UInt8 : MsgPackMarsha
//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)]
}
}
由于数组在swift中是一个结构,我希望避免重新定义嵌入数组的新型数组 正在扩展的ie数组类型中的类型参数T在范围内,可用于确定类型。用于执行类型检查T是您的类型。与数组问题无关,但请注意,对于UInt16/32,您必须右移8、16或24,而不是2、3或4。我太傻了:谢谢!陛下我不允许在非@objc协议上使用is运算符。错误是:无法从'T'向下转换为非@objc协议类型'MsgPackMarshable'非常奇怪。我找不到任何直接与此相关的东西,而不生成一个具有额外约束的函数,其中t被约束到一个附加协议。也许你可以使用MsgPackMarshable协议。你说的也许你可以使用MsgPackMarshable协议是什么意思?你已经在使各种对象符合MsgPackMarshable协议。如果在函数上使用a表示T必须符合该协议,则您知道所有项都符合MsgPackMarshable,并且在for循环中您可以使用这些方法。它不能帮助您确切地知道哪种类型,但是您可以调用这些方法。
extension Array: MsgPackMarshable{
func msgpack_marshal() -> Array<Byte>{
for item in self{
//How to check type here?
}
return []
}
}