【问题标题】:Swift - Extension on a Generic typed class/structure?Swift - 通用类型类/结构的扩展?
【发布时间】:2014-08-11 12:26:41
【问题描述】:

如何向泛型类型类添加扩展方法,并访问该类上定义的泛型类型以使方法类型安全?

以下方法会产生编译错误,因为 T 与类上定义的泛型类型不同。

extension Array {
   mutating public func addTwo<T>(object: T) {
      append(object)
      append(object)
   }
}

【问题讨论】:

标签: generics swift


【解决方案1】:

只需删除&lt;T&gt;。您可以在没有它的扩展范围内引用T,或等效的Element

【讨论】:

  • 为什么是T?是因为他们使用键 T 作为泛型类型吗?如果他们使用 K 而不是我会使用 K?所以基本上我需要查看源代码才能看到泛型类型被称为什么?
  • 是否可以接受同样是 Equatable 的 T 类型的参数?
  • 出于这个原因,您可能更喜欢使用Element,它是泛型定义中的类型别名。你的另一个问题是this one
【解决方案2】:

Array 的定义使用T 作为类型参数;因此,您可以在可能添加到Array 的任何扩展中访问它。在您的情况下,以下工作:

$ swift
Welcome to Swift!  Type :help for assistance.
  1> extension Array { 
  2.     mutating public func addTwo (obj: T) { append(obj); append(obj) } 
  3. }    
  4> class Foo {}
  5> var ar:[Foo] = []
ar: [Foo] = 0 values
  6> ar.addTwo(Foo())
  7> ar
$R0: [Foo] = 2 values {
  [0] = {}
  [1] = {}
}

请注意,因为Array 的定义有typealias Element = T,所以您也可以使用Element(为了便于阅读)。

【讨论】:

    猜你喜欢
    • 2020-12-30
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多