2017-04-07 34 views
0

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

喜欢的东西

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

背景: 我试图写在迅速小端二进制流的流解码器。的那

部分是一个通用的功能

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) 
    } 
} 

其无法编译为整数协议没有指定的init(litteEndian:T)是可用的,并且明显的方法来解决它似乎有一个协议添加了该规范。

+0

协议不允许泛型参数,所以上面的第一个片段,你可以比较使用(协议Foo {associatedtype T; init(litteEndian:T);/* ... * /}')。 – dfri

回答

0

您可以使用自助在协议引用具体类型的类/类型实现它的:

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

完美,参考自我作品。现在我的下一个问题: FUNC readUInt32() - > UInt32的{ 回报readIntLE() } 由于只有上面的定义,我得到一个错误 '通用参数T无法infered ' 延伸UInt32的:EndianConvertible { } 'Type UInt32 does not conform to EndianConvertible' –