我试图测试从工厂生成的两个对象是否相同,但编译器似乎不允许对仅符合相同协议的对象进行身份检查.然而,将这两个对象转换为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
}
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*n R 10
身份运算符===只能应用于引用,即类的实例.如果符合FooBar协议的所有类型都是类,那么您可以将其声明为"类协议"
protocol FooBar : class { }
Run Code Online (Sandbox Code Playgroud)
然后
if foo1! === foo2! { ... }
Run Code Online (Sandbox Code Playgroud)
编译并按预期工作,因为编译器"知道"两个操作数都是对类实例的引用.
| 归档时间: |
|
| 查看次数: |
665 次 |
| 最近记录: |