簡體   English   中英

如何比較協議實例和類實例

[英]How to compare instances of protocols and instances of classes

我有一個協議:

protocol MasterGame {}

和一個產生單例的類

class MasterGameImp : MasterGame {
    static let sharedInstance = MasterGameImp()
}

現在,我有了另一個依賴於協議並具有由其實例化程序注入的屬性的對象。

class MyGameObject {
    var masterGame: MasterGame?
}

我想編寫一個單元測試來測試單例是否已正確注入MyGameObject實例中。 什么是正確的方法? ===不接受MasterGame和MasterGameImp類型的參數。 因此,顯然您不能以這種方式檢查協議和類之間的相同性。 因此,我需要另一種方法來檢查單例和存儲屬性之間的一致性。 謝謝!

大大簡化了以下問題:

protocol P {
}

class X : P {
}

let x = X()
let p : P = x

print(x === p)

二進制運算符===不能應用於類型'X'和'P'的操作數

print((x as P) === p)

二進制運算符===不能應用於兩個'P'操作數

print(x === (p as! X))

正確 ->工作

您所要做的就是將協議升級為其實現,這實際上一點都不漂亮:/

我沒有找到更好的解決方案,它與swift處理不同於常規類繼承的協議有關。 更改為class P將導致以上所有三個語句成功。

正如@matt所指出的,如果您錯誤地提供了一個錯誤的p(實際上不是X那么代碼當然會崩潰。 要解決該問題,您應該將支票包裝為if條件:

if let xp = p as? X {
    print(x === xp)
} else {
    print("p is not of type X")
}

暫無
暫無

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

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