2015-10-16 89 views
0

這個一直在竊聽我一段時間。我不確定我是否錯過了一些東西,但是不應該這樣做?iOS Swift:將泛型數組轉換爲子類數組

protocol IDIdentifiable { } 

class A : IDIdentifiable { 
    let id : Int 
    init(id: Int) { self.id = id } 
} 

class B : IDIdentifiable { 
    let id : Int 
    init(id: Int) { self.id = id } 
} 

func findObjectById<T: IDIdentifiable>(objects: [T], id: Int) -> T { 
    if let casted = objects as? [A] { 
     return casted.filter{ $0.id == id }[0] 
    } 
} 

將對象參數強制轉換爲A對象數組時出錯。錯誤說'A' is not a subtype of 'T',顯然不是這種情況。

這真的很煩人,因爲我想有一個通用的方法可以同樣的方式處理多個類的對象數組。我首先嚐試使用switch-statements創建一個額外的協議,如IDIdentifiable,但是這些方法都沒有奏效。

我很高興爲您提供任何建議!

+0

這和我這裏的問題不一樣嗎? http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself – matt

+1

停止說「沒有工作」。這沒有意義。你已經通過解釋這個問題是一個編譯錯誤來解決了這個問題。那就是我所追求的。 – matt

+0

確實非常相似。儘管如此。 – Yeehaw

回答

0

如果您聲明協議要求變量id,則不需要在通用方法中轉換類型。

protocol IDIdentifiable { 
    var id : Int { get set } 
} 

class A : IDIdentifiable { 
    var id : Int 
    init(id: Int) { self.id = id } 
} 

class B : IDIdentifiable { 
    var id : Int 
    init(id: Int) { self.id = id } 
} 

func findObjectById<T: IDIdentifiable>(objects: [T], id: Int) -> T { 
    return objects.filter{ $0.id == id }[0] 
} 
+0

這是真的,但它沒有解釋類型爲協議的數組的問題。如果這是關於一個沒有被協議定義的屬性,但只在A類中定義的屬性呢? – matt

+0

我會接受這個答案,因爲它現在幫助我解決了這個特殊問題。正如@matt說的那樣,這對一般問題沒有幫助。 – Yeehaw

+0

我同意。你接受它是正確的,但我們沒有得到任何有關_my_問題的地方。 :) – matt