24

拡張機能を使用して、別のプロトコルにプロトコル準拠を追加することはできますか?

たとえば、A が B に準拠するようにします。

protocol A {
  var a : UIView {get}
}

protocol B {
  var b : UIView {get}
}

タイプ A のオブジェクトに B のデフォルトの実装 (準拠) を与えたい

// This isn't possible
extension A : B {
  var b : UIView {
    return self.a
  }
}

動機は、独自の「ブリッジ」を作成せずに B が必要な場合に A のオブジェクトを再利用することです。

class MyClass {
  func myFunc(object : A) {
    ...
    ...
    let view = object.a 
    ... do something with view ...

    myFunc(object)      // would like to use an 'A' without creating a 'B'
  }

  func myFunc2(object : B) {
    ...
    ...
    let view = object.b
    ... do something with view ...

  }
}

補足として、クラスを拡張してプロトコルを実装できます

class C {
  let C : UIView
}

// this will work
extension C : B {
  var B : UIView {
    return self.c
  }
}

プロトコルはデフォルトの実装を提供できます

extension A {
  // a default implementation
  var a : UIView {
     return UIView()
  }
}
4

2 に答える 2

20

を拡張する場合A、型が にも準拠するように指定できますB

extension A where Self: B {
    var b : UIView {
        return self.a
    }
}

次に、タイプをAandBに準拠させます。

struct MyStruct : A, B {
    var a : UIView {
        return UIView()
    }
}

プロトコルの拡張により、 のインスタンスはとMyStructを使用できるようになります。abaMyStruct

let obj = MyStruct()
obj.a
obj.b
于 2016-05-20T18:04:58.230 に答える