2015-08-16 62 views
4

我試圖測試從工廠生成的兩個對象是否相同,但編譯器似乎不允許對僅符合相同協議的對象進行身份檢查。然而,將這兩個對象投射到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 

    } 
    } 

} 

回答

6

身份操作===只能應用於引用的情況,即什麼。 如果所有符合FooBar協議的類型都是類則 你可以聲明它作爲「類協議」

protocol FooBar : class { } 

然後

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

編譯和按預期工作,因爲編譯器「知道」這兩個操作數都是對類實例的引用。

相關問題