簡體   English   中英

class 擴展中的默認 Swift 協議實現符合其他協議

[英]Default Swift protocol implementation in extension for class that conforms to other protocol

我有一個 class,其中一些子類符合 Protocol1。 Protocol1 中的 API 足以實現 Protocol2。 我想做類似下面的事情,當我的 class 的實例符合 Protocol1 時,我可以在其中定義 Protocol2 的默認實現。 我的第一次嘗試是這樣的:

public class MyClass {}

public protocol Protocol1 {
  var someProperty: Any { get }
}

public protocol Protocol2 {
  var func someFunc()
}

extension Protocol2 where Self: MyClass & Protocol1 {
  public func someFunc() {
    // Functionality that uses `.someProperty`
  } 
}

這編譯得很好,所以我認為它會起作用。 但是我嘗試用類似的東西進行測試:

public class MySubclass: MyClass {}
extension MySubclass: Protocol1 {
  public var someProperty: Any {
    // Return property value.
  }
}

let instance = MySubclass()
instance.someFunc()  // Throws compilation error

不幸的是,當我嘗試從 Protocol2 調用 function 時,我得到了一個Value of type 'MySubclass' has no member 'someFunc'編譯錯誤。 有沒有辦法為符合 Protocol1 的 MyClass 子類定義 Protocol2 的默認實現,或者我只需要單獨擴展每個子類?

其實想通了。 您可以使用 where 子句定義默認實現,但您仍然需要明確遵守 Protocol2。 我有幾個符合 Protocol1 的 MyClass 子類,所以我不想重復實現,但只需將明確的協議一致性添加到帶有空定義塊的 Protocol2 即可:

extension Protocol2 where Self: MyClass & Protocol1 {
  public func someFunc() {
    // Functionality that uses `.someProperty`
  } 
}

public class MySubclass: MyClass {}
extension MySubclass: Protocol1 {
  public var someProperty: Any {
    // Return property value.
  }
}
extension MySubclass: Protocol2 {}

MySubclass().someFunc() // Works fine

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM