通用类型`UnsafeMutablePointer的扩展`

发布于 2021-01-31 23:35:13

我想为此创建一个扩展名UnsafeMutablePointer,仅影响UnsafeMutablePointer<UInt8>

我了解这些说明是相关的,但不确定如何:

扩展通用类型时,不提供类型参数列表作为扩展定义的一部分。而是在扩展程序的正文中提供原始类型定义的类型参数列表,并且原始类型参数名称用于引用原始定义的类型参数。

基本上,我正在尝试使用此方法:

func toSwift(length: Int) -> [Int] {
    var retVal : [Int] = []
    for i in 0..<length {
        retVal.append(Int(self[i]))
    }
    return retVal
}

self没有UnsafeMutablePointer<UInt8>参数的情况下采取行动…这可能吗?

关注者
0
被浏览
58
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    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)
        }
    }
    

    迅捷前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的解决方案。我只是为了完成而添加此内容。

    尽管值得注意的是,extension Type where Generic == SomeType在Swift Generics
    Manifesto中
    提出了对扩展名()具有相同类型的具体要求,但希望在以后的Swift版本中可以实现。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看