如何比较协议实例和类实例

时间:2015-10-16 22:36:11

标签: ios swift swift2

我有一个协议:

protocol MasterGame {}

和一个产生单身的类

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

现在我有另一个依赖于协议的对象,并且具有由它的实例化器注入的属性。

class MyGameObject {
    var masterGame: MasterGame?
}

我想编写一个单元测试来测试单例是否正确地注入到MyGameObject的一个实例中。这样做的正确方法是什么? ===不接受MasterGame和MasterGameImp类型的参数。显然,你无法在协议和类之间检查同一性。所以我需要另一种方法来检查单例和存储属性之间的相同性。谢谢!

1 个答案:

答案 0 :(得分:2)

非常简化的问题如下:

svg.append("text")
    .attr("x", 295)             
    .attr("y", 30)
    .attr("text-anchor", "middle")  
    .style("font-size", "16px") 
    .style("text-decoration", "underline")  
    .text("Value vs Date Graph");
  

二进制运算符protocol P { } class X : P { } let x = X() let p : P = x print(x === p) 不能应用于“X”和“P”类型的操作数

===
  

二进制运算符print((x as P) === p) 不能应用于两个“P”操作数

===
  

true - >工作

你需要做的是将协议转发到它的实现,这实际上并不完美:/

我没有找到更好的解决方案,它有一些关于swift如何处理与常规类继承不同的协议。更改为print(x === (p as! X)) 将导致上述所有三个语句都成功。

正如@matt所指出的那样,如果你错误地提供了错误的p,那么代码当然会崩溃,而p实际上并不是class P。要解决该问题,您应该将支票包装成if条件:

X