Arrays Swift扩展确定的泛型类型,而不使用objc绑定

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

我想尝试在纯swift中实现messagepack。在我来到Array之前,一切都很顺利

我的方法是实现一个名为MsgPackMarshable的协议,它扩展了primitiv类型:

 //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 []
    }
}