如何在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)可用,并且明显的修复方法似乎有一个添加该规范的协议。
答案 0 :(得分:0)
您可以在协议中使用Self来引用实现它的类/类型的具体类型:
protocol EndianConvertible
{
init( litteEndian: Self );
func litteEndian() -> Self;
}