我们可以在没有强制转换的情况下快速测试符合相同协议的对象是不是相同?

Posted

技术标签:

【中文标题】我们可以在没有强制转换的情况下快速测试符合相同协议的对象是不是相同?【英文标题】:Can we test if objects conforming to the same protocol are identical in swift without casting?我们可以在没有强制转换的情况下快速测试符合相同协议的对象是否相同? 【发布时间】:2015-11-09 09:40:33 【问题描述】:

我试图测试从工厂生成的两个对象是否相同,但编译器似乎不允许对仅符合相同协议的对象进行身份检查。然而,将两个对象都转换为 AnyObject 似乎很好。有没有办法避免看似不必要的演员阵容?

这是一个简单的例子,演示了我所看到的(在 swift 1.2 中)

protocol FooBar 



class Foo: FooBar   



class Bar 

  let foo1: FooBar?
  let foo2: FooBar?

  init() 
    foo1 = Foo()
    foo2 = Foo()
    if foo1! as? AnyObject === foo2! as? AnyObject   // this is fine

    

    if foo1! === foo2!    // Birnary operator '===' cannot be applied to two FooBar operands

    
  


【问题讨论】:

【参考方案1】:

身份运算符=== 只能应用于引用,即类的实例。 如果所有符合FooBar 协议的类型都是类,那么 您可以将其声明为“类协议”

protocol FooBar : class  

然后

if foo1! === foo2!  ... 

按预期编译和工作,因为编译器“知道” 两个操作数都是对类实例的引用。

【讨论】:

以上是关于我们可以在没有强制转换的情况下快速测试符合相同协议的对象是不是相同?的主要内容,如果未能解决你的问题,请参考以下文章

Java什么情况下数据类型可以自动转换?什么情况下需要强制转换?

如何将 Class 对象转换为符合协议

如何在没有基本 http 身份验证的情况下强制 MockitoJUnitRunner 失败?

如何模拟强制关闭的 TCP 连接?

C语言举例说明啥情况下会发生自动类型转换

Java什么情况下数据类型可以自动转换?什么情况下需要强制转换?