2015-10-16 65 views
1

我有一個協議:如何比較協議的實例和類的實例

protocol MasterGame {} 

,併產生一個單身

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

現在一類我有對依賴另一個對象協議,並具有由它的實例化器注入的屬性。

class MyGameObject { 
    var masterGame: MasterGame? 
} 

我想寫一個單元測試來測試該單適當注入MyGameObject的一個實例。什麼是正確的方法來做到這一點? ===不接受MasterGame和MasterGameImp類型的參數。所以顯然你不能在協議和類之間檢查相同性。所以我需要另一種方式來檢查單身人士和儲存財產之間的相同性。謝謝!

+0

'=='???老實說,我真的不明白你在問什麼?如何比較對象!? – luk2302

+0

'=='是對平等的檢查。 '==='是對同一性的檢查,(即對象是完全相同的實例)。所以我想要寫一個測試的是存儲的屬性和單例是完全相同的對象。 –

+0

是的!?那麼,問題在哪裏呢?如果===返回結果爲false,則顯然使用單元測試發現了一個錯誤,或者測試錯誤。我不知道我們如何能幫助你! – luk2302

回答

2

非常簡單的問題是:

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") 
} 
+0

你不想說'as!',因爲如果演員失敗會崩潰。 – matt

+0

@matt Xcode告訴我我**有**使用'as!'。但是你當然是正確的,如果你提供了一個不是X的代碼將會崩潰。 – luk2302

+0

@matt是添加if-wrap更好的方法!? – luk2302