Swift在不使用objc绑定的情况下扩展了确定的泛型类型

时间:2014-07-14 08:40:16

标签: arrays generics dictionary swift

我想尝试在纯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>

1 个答案:

答案 0 :(得分:0)

来自扩展类型(即T)的类型参数Array在范围内,可用于确定类型。使用the is operator进行类型检查(T is yourtype)。