web-dev-qa-db-ja.com

既存のプロトコルを拡張して、デフォルトの実装で別のプロトコルを実装します

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

たとえば、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()
  }
}
21
Avner Barr

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

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

次に、タイプをAおよびBに準拠させます。

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

プロトコルの拡張により、MyStructのインスタンスは、aのみがbに実装されていても、aおよびMyStructを使用できます。 _:

let obj = MyStruct()
obj.a
obj.b
18
ABakerSmith

AからBinheritsを作成できます。

protocol A: B { var a: String { get } }
protocol B    { var b: String { get } }

// Default implementation of property b
extension A {
    var b: String { get { return "PropertyB" } }
}


class MyClass: A {
    var a: String { get { return "PropertyA" } }

    func printA(obj: A) {
        print(obj.a)
        printB(obj)
    }

    func printB(obj: B) {
        print(obj.b)
    }
}

let obj = MyClass()
obj.printA(obj)

ABを継承するため、BのすべてのプロパティはAで使用できます。

5
Code Different