一尘不染

我们可以快速测试符合相同协议的对象是否相同吗?

swift

我试图测试从工厂生成的两个对象是否相同,但是编译器似乎不允许对仅符合同一协议的对象进行身份检查。但是,将两个对象都转换为AnyObject似乎很好。无论如何,有必要避免似乎不必要的转换?

这是一个简单的示例,演示了我所看到的内容(快速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

    }
  }

}

阅读 196

收藏
2020-07-07

共1个答案

一尘不染

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

protocol FooBar : class { }

然后

if foo1! === foo2! { ... }

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

2020-07-07