gpt4 book ai didi

swift - 通用类型的扩展 `UnsafeMutablePointer`

转载 作者:搜寻专家 更新时间:2023-11-01 05:57:05 25 4
gpt4 key购买 nike

我想为 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
}

采取行动self没有 UnsafeMutablePointer<UInt8>作为参数...这可能吗?

最佳答案

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 之前

可以做到这一点——尽管它不是特别好。您必须创建一个新协议(protocol)才能“标记”UInt8 类型,然后将您的扩展限制为该协议(protocol)。它还不允许您轻松地指定 Int(...) 初始化程序可以采用 _UInt8Type 输入——您必须实现一个 hacky 的“影子”方法来这样做。

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's solution .我添加这个只是为了完成。

虽然值得注意的是已经提出了对扩展的具体相同类型要求(extension Type where Generic == SomeType)as a part of the Swift Generics Manifesto – 所以希望这在 Swift 的 future 版本中成为可能。

关于swift - 通用类型的扩展 `UnsafeMutablePointer<UInt8>`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37977817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com