当前位置: 首页 > 面试题库 >

通用类型`UnsafeMutablePointer的扩展`

夏烨霖
2023-03-14
问题内容

我想为此创建一个扩展名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>参数的情况下采取行动…这可能吗?


问题答案:

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版本中可以实现。



 类似资料:
  • 问题内容: Java是否可以让类扩展泛型,以便您可以将方法注入通过代码传递的任何类中?(或者是否有其他方法可以使用Java将方法注入或重写到现有类中?) 我所说的“扩展通用类型”是这样的(类“ Textended GameObject”属于游戏,可能不会更改,并且是未知的,因为它是在运行时(从其他mods)加载到游戏中的): onTick由GameEngine调用,通过这种方式,我可以将每个现有的

  • 问题内容: 我在某处看到了这种模式: 通过将新类型指定为泛型的实际类型来扩展泛型,此结构有点不寻常。有什么用?此模式有名称吗?有其他替代方式吗? 示例:https://code.google.com/p/selenium/wiki/LoadableComponent 跳到: 编辑:阅读响应后,似乎我需要改变编译器对类型检查的理解。在我的脑海中,我有这种模式的牛肉是,如果两个A需要相同,那么有没有办

  • 考虑以下TS定义: 没什么问题,但我想知道是否有一个等效?显然,可以将泛型传递到接口中,尽管这不是我想要的,例如: 这里的示例是在React代码的上下文中,但潜在的问题是基本的TS。

  • 问题内容: public class MyGeneric {} 据我所知,以上示例中的两个子类均有效。我想知道Java如何知道何时在实例化子类时定义超类中给定的类型,以及何时将它们定义为实际的类名(即,它如何知道T,E不是类名)? 旁注,是否允许(即使不常见)对通用类型使用多个字母?如果(由于某些严重的计划错误)类型与现有类冲突,该怎么办? 那会发生什么呢? 编辑:感谢您的及时答复。为了回答我的第

  • 问题内容: 我是这些泛型类型的新手。在下面的代码中,我创建了一个方法,该方法接受扩展了“字符串”的项目列表。 我的问题?-当列表可以分配一个新列表时,为什么不能添加字符串“ test” …这给了我一个编译错误。 问题答案: 因为与此处无关的不是运行时类型。仍然是类型,您刚巧将其分配给。考虑一下: 编译器无法确定其是否有效-它仅基于的编译时类型进行决策。 请注意,实际上没有任何扩展,这是一个类。

  • 问题内容: 在Java中,我可以从通用超类型进行扩展吗?根据这篇文章,看来我应该能够:http : //www.ibm.com/developerworks/java/library/j-djc05133.html。 但是,当我在应用程序中执行类似操作时,出现以下错误: “无法将类型参数T引用为超类型。” 有谁知道我是否能够从Java中的泛型超型扩展?而且,如果是这样,是否需要特殊的东西来实现这一