Swift 泛型类型“unsafemeutablepointer”的扩展<;UInt8>`

Swift 泛型类型“unsafemeutablepointer”的扩展<;UInt8>`,swift,generics,unsafe-pointers,Swift,Generics,Unsafe Pointers,我想为UnsafeMutablePointer创建一个只影响UnsafeMutablePointer的扩展 我理解这些说明是相关的,但我不确定如何: 扩展泛型类型时,不提供类型参数列表作为扩展定义的一部分。相反,原始类型定义中的类型参数列表在扩展的主体中可用,并且原始类型参数名称用于引用原始定义中的类型参数 基本上,我尝试使用这种方法: func toSwift(length: Int) -> [Int] { var retVal : [Int] = [] for i in

我想为
UnsafeMutablePointer
创建一个只影响
UnsafeMutablePointer
的扩展

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

扩展泛型类型时,不提供类型参数列表作为扩展定义的一部分。相反,原始类型定义中的类型参数列表在扩展的主体中可用,并且原始类型参数名称用于引用原始定义中的类型参数

基本上,我尝试使用这种方法:

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

对于0..中的i,当前只能对协议执行此操作,而不能对特定的类或结构执行此操作。您可以创建一个虚拟协议,并使用它扩展类/结构,如

但是,我看不出有什么理由不让这段代码保持通用性。您对此有何看法

extension UnsafeMutablePointer {
    func toArray(withLength length: UInt) -> [Memory] { //Change "Memory" to "Pointee" in Swift 3
        return Array(UnsafeBufferPointer(start: self, count: Int(length)))
    }
}

目前,您只能对协议执行此操作,而不能对特定的类或结构执行此操作。您可以创建一个虚拟协议,并使用它扩展类/结构,如

但是,我看不出有什么理由不让这段代码保持通用性。您对此有何看法

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 您可以这样做–尽管这不是特别好。您必须创建一个新协议,以便“标记”
UInt8
类型,然后将扩展限制到该协议。它还不允许您轻松指定
Int(…)
初始化器可以接受
\u 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()}
    }
}
总的来说,我更愿意保持这个完全通用的版本,并继续使用。我只是为了完成而添加这个版本

尽管值得注意的是,已经提出了对扩展具有具体的相同类型要求(
扩展类型,其中Generic==SomeType
),但希望这在未来版本的Swift中成为可能。

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 您可以这样做–尽管这不是特别好。您必须创建一个新协议,以便“标记”
UInt8
类型,然后将扩展限制到该协议。它还不允许您轻松指定
Int(…)
初始化器可以接受
\u 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()}
    }
}
总的来说,我更愿意保持这个完全通用的版本,并继续使用。我只是为了完成而添加这个版本


尽管值得注意的是,对扩展有具体的相同类型要求(
扩展类型,其中Generic==SomeType
)已经提出–因此希望这在Swift的未来版本中成为可能。

如何从
Unsafemtablepointer
获取
Int
?使用
内存
?@JAL该方法的签名有效,实际上是
func-toSwiftFromData(数据:Unsafemtablepointer,长度:Int)->[Int]{
然后你看到的是
self
那是
数据
…这回答了问题吗?你如何从
unsafemtablepointer
中得到
Int
?使用
内存
?@JAL该方法的签名,有效,实际上是
函数toSwiftFromData(数据:unsafemtablepointer,长度:Int)->[Int]{
然后你看到的是
self
那是
数据
…这回答了问题吗?太神奇了。
[内存]
是类型化的吗?@DanRosenstark你是什么意思?
Memory
是结构
UnsafePointer
的泛型类型参数。当你说类似
UnsafePointer
的话时,你是说“一个
UnsafePointer
,对于它,泛型类型参数
Memory
专门表示
UInt8
。我知道它被称为
Memory
(或Swift 3中的
Pointee
),你问题中的引用甚至提到它:“相反,原始类型定义中的类型参数列表在扩展的主体中可用,并且原始类型参数名称用于引用原始定义中的类型参数”Let us.That's Azing.
[Memory]
是类型化的吗?@DanRosenstark你是什么意思?
Memory
是结构
UnsafePointer
的泛型类型参数。当你说类似
UnsafePointer
的话时,你说的是“一个
UnsafePointer
,它的泛型类型参数
Memory
专门表示
UInt8
。我知道它被称为
Memory
(或Swift 3中的
Pointee
),你问题中的引用甚至提到它:相反,原始类型定义中的类型参数列表在扩展的主体中可用,原始类型参数名称用于引用原始定义中的类型参数“让我们来看看。这太棒了,我可能会在一段时间内将其更改为最佳答案。虽然看起来有点粗糙……但我不知道这是否会在某个时候打破。但是……太好了,谢谢你提供了一个有效的解决方案!@DanRosenstark虽然它看起来确实粗糙,但实际上它利用了一些基本的Swift概念。”(协议&使用协议定义的“新”功能扩展现有类型)-因此,我看不到在Swift的未来版本中会出现这种情况(我也无法立即想到任何会影响它的进化建议)尽管如此,如果这是生产代码,那么我会考虑编写<代码>