通用类型 `UnsafeMutablePointer<UInt8>` 的扩展
Extension for Generic Type `UnsafeMutablePointer<UInt8>`
我想为 UnsafeMutablePointer
创建一个只影响 UnsafeMutablePointer<UInt8>
...
的扩展
我知道这些说明是相关的,但我不确定如何:
When you extend a generic type, you do not provide a type parameter list as part of the extension’s definition. Instead, the type parameter list from the original type definition is available within the body of the extension, and the original type parameter names are used to refer to the type parameters from the original definition.
基本上,我正在尝试使用这种方法:
func toSwift(length: Int) -> [Int] {
var retVal : [Int] = []
for i in 0..<length {
retVal.append(Int(self[i]))
}
return retVal
}
在没有 UnsafeMutablePointer<UInt8>
作为参数的情况下作用于 self
...这可能吗?
目前,您只能对协议执行此操作,而不是特定的 类 或结构。你可以制作一个虚拟协议并用它扩展你的 class/struct,就像 .
但是,我看不出有什么理由不保留此代码的通用性。你怎么看这个?
extension UnsafeMutablePointer {
func toArray(withLength length: UInt) -> [Memory] { //Change "Memory" to "Pointee" in Swift 3
return Array(UnsafeBufferPointer(start: self, count: Int(length)))
}
}
Swift 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)
}
}
前 Swift 3.1
你可以做到这一点——尽管它不是特别好。您必须创建一个新协议才能 'tag' 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{[=11=]._asInt()}
}
}
总而言之,我更愿意保持这个完全通用并使用 。我只是为了完成才添加这个。
尽管值得注意的是已经提出了对扩展 (extension Type where Generic == SomeType
) 的具体相同类型要求 as a part of the Swift Generics Manifesto – 所以希望这在 Swift 的未来版本中成为可能.
我想为 UnsafeMutablePointer
创建一个只影响 UnsafeMutablePointer<UInt8>
...
我知道这些说明是相关的,但我不确定如何:
When you extend a generic type, you do not provide a type parameter list as part of the extension’s definition. Instead, the type parameter list from the original type definition is available within the body of the extension, and the original type parameter names are used to refer to the type parameters from the original definition.
基本上,我正在尝试使用这种方法:
func toSwift(length: Int) -> [Int] {
var retVal : [Int] = []
for i in 0..<length {
retVal.append(Int(self[i]))
}
return retVal
}
在没有 UnsafeMutablePointer<UInt8>
作为参数的情况下作用于 self
...这可能吗?
目前,您只能对协议执行此操作,而不是特定的 类 或结构。你可以制作一个虚拟协议并用它扩展你的 class/struct,就像
但是,我看不出有什么理由不保留此代码的通用性。你怎么看这个?
extension UnsafeMutablePointer {
func toArray(withLength length: UInt) -> [Memory] { //Change "Memory" to "Pointee" in Swift 3
return Array(UnsafeBufferPointer(start: self, count: Int(length)))
}
}
Swift 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)
}
}
前 Swift 3.1
你可以做到这一点——尽管它不是特别好。您必须创建一个新协议才能 'tag' 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{[=11=]._asInt()}
}
}
总而言之,我更愿意保持这个完全通用并使用
尽管值得注意的是已经提出了对扩展 (extension Type where Generic == SomeType
) 的具体相同类型要求 as a part of the Swift Generics Manifesto – 所以希望这在 Swift 的未来版本中成为可能.