在swift协议定义中使用模板类型

时间:2017-04-07 06:34:39

标签: generics swift3 protocols

如何在swift中声明一个协议,其函数参数类型取决于采用协议的类型?

这样的东西
 protocol EndianConvertible<T> {
       init( litteEndian: T );
       func litteEndian() -> T;
 }

背景: 我试图在swift中为一个小端二进制流写一个流解码器。

部分内容是通用功能

class ReadStream {

 var offset : Int = 0;
 var data : Data;

 func readIntLE<T : Integer>() -> T {
    var d : T = 0
    let intBits = data.withUnsafeBytes({(bytePointer: UnsafePointer<UInt8>) -> T in
        bytePointer.advanced(by: offset).withMemoryRebound(to: T.self, capacity: MemoryLayout<T>.size) { pointer in
            offset += MemoryLayout<T>.size
            return pointer.pointee
        }
    })
    d = T(littleEndian: intBits)
  }
} 

无法编译,因为Integer协议没有指定init(litteEndian:T)可用,并且明显的修复方法似乎有一个添加该规范的协议。

1 个答案:

答案 0 :(得分:0)

您可以在协议中使用Self来引用实现它的类/类型的具体类型:

protocol EndianConvertible
{
       init( litteEndian: Self );
       func litteEndian() -> Self;
}