繁体   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