【发布时间】:2017-04-07 06:34:39
【问题描述】:
如何在 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)
}
}
由于 Integer 协议未指定 init(litteEndian: T) 可用而无法编译,并且修复它的明显方法似乎有一个添加该规范的协议。
【问题讨论】:
-
协议不允许泛型参数,因此对于上面的第一个 sn-p,您可以在协议中使用关联类型 (
protocol Foo { associatedtype T; init(litteEndian: T); /* ... */ })。