2016-12-01 79 views
1

使用相關類型的協議,我有問題:從協議類型的Swift associatedType - 如何做到這一點?

protocol Searchable{  
    func matches(text: String) -> Bool 
} 

protocol ArticleProtocol: Searchable { 
    var title: String {get set} 
} 

extension ArticleProtocol { 
    func matches(text: String) -> Bool { 
     return title.containsString(text) 
    } 
} 

struct FirstArticle: ArticleProtocol { 
     var title: String = "" 
} 

struct SecondArticle: ArticleProtocol { 
     var title: String = "" 
} 

protocol SearchResultsProtocol: class {  
    associatedtype T: Searchable 
} 

當我試圖實現搜索結果的協議,我得到的編譯問題:

「型SearchArticles不符合協議SearchResultsProtocol」

class SearchArticles: SearchResultsProtocol { 
    typealias T = ArticleProtocol 
} 

據我所知,它發生是因爲SearchArticles類中的T不是來自具體類型(該示例中的結構),而是來自協議類型。

有沒有辦法解決這個問題?

提前致謝!

+1

可能的複製[在Swift中無法使用協議作爲其他協議中的關聯類型](http://stackoverflow.com/questions/37360114/unable-to-use-protocol-as-associatedtype-in​​-another-protocol-in-swift) – Hamish

回答

1

associatedtype不是一個佔位符(協議),它是一個具體的類型。通過增加一個通用的類的聲明,你可以實現你想要這樣的結果相同....

class SearchArticles<V: ArticleProtocol>: SearchResultsProtocol { 
    typealias T = V 
} 

然後,當你用SearchArticles在你的應用程序,你可以聲明let foo = SearchArticles<FirstArticle>let foo = SearchArticles<SecondArticle>

相關問題