斯威夫特 3.1 更新
从 Swift 3.1(Xcode 8.3 beta 版提供)开始,现在支持具体的同类型要求。你现在可以说:
extension UnsafeMutablePointer where Pointee == UInt8 {
func asArray(withLength length: Int) -> [Int] {
return UnsafeBufferPointer(start: self, count: length).map(Int.init)
}
}
斯威夫特前 3.1
你可以这样做——尽管它不是特别好。您必须创建一个新协议才能“标记”该UInt8
类型,然后将您的扩展限制到该协议。它也不允许您轻松指定Int(...)
初始化程序可以接受_UInt8Type
输入 - 您必须实现一个 hacky 'shadow' 方法来做到这一点。
protocol _UInt8Type {
func _asInt() -> Int
}
extension UInt8 : _UInt8Type {
func _asInt() -> Int {
return Int(self)
}
}
// Change 'Pointee' to 'Memory' for Swift 2
extension UnsafeMutablePointer where Pointee : _UInt8Type {
func asArray(withLength length:Int) -> [Int] {
return UnsafeBufferPointer(start: self, count: length).map{$0._asInt()}
}
}
总而言之,我更愿意保持这个完全通用并使用@AMomchilov 的解决方案。我只是为了完成而添加这个。
尽管值得注意的是,作为 Swift Generics Manifesto 的一部分extension Type where Generic == SomeType
已经提出了对扩展 ( )具有具体的相同类型要求- 所以希望这在未来的 Swift 版本中是可能的。