Swift:使用协议扩展来专门实现方法

时间:2018-08-21 20:50:12

标签: ios swift generics protocols swift-extensions

提供一些背景信息:

P代表财产。该代码的目的是,不同类型的值应由单独的方法(例如serializeInt,serializeDouble等)处理,类似于方法重载,但参数的类型来自类型参数。

以下代码实际上可以正常工作。它调用专门的pr(_:Int)实现,并显示“ int”。

但是,如果我将声明“ func pr(_ t:Int)”更改为注释的一个“ func pr(_ t:T)”,则将调用通用版本。

任何人都有任何指向指定此行为的地方或为什么这样工作的指针?

  protocol P {
     associatedtype T
     // this will be 'specialized' for concrete types
     func pr(_ t: T)

     // the operation that should call different pr implementations depending on T
     func op(_ t: T)
  }

  extension P {
     func op(_ t: T) {
        pr(t)
     }
  }

  // fallback implementation
  extension P {
     func pr(_ t: T) {
        print("generic")
     }
  }

  // pr 'specialized' on Int
  extension P where T == Int {
     //   func pr(_ t: T) {
     func pr(_ t: Int) {
        print("int")
     }
  }


  struct Prop<T>: P {
  }

  // create an Int prop and do the op
  let p = Prop<Int>()

  p.op(1)

1 个答案:

答案 0 :(得分:0)

没有看到任何奇怪的行为。如果您取消注释此行– func pr(_ t: T) {

此处p.op(1)将调用默认方法,因为您尚未提供op方法where T == Int的实现。而默认的op会调用默认的pr,这就是它显示“通用”的原因。