协议类型的Swift AssessType-如何做到这一点



我使用关联类型作为协议遇到问题:

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
}

我知道,发生了,因为SearchArtsicles类中的T不是来自具体类型(该示例中的struct),而是来自协议类型。

有没有办法解决此问题?

预先感谢!

associatedtype并不是要成为占位符(协议),而是要成为混凝土类型。通过在类声明中添加通用,您可以达到这样想要的结果。

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

然后,当您在应用周围使用SearchArticles时,您可以声明let foo = SearchArticles<FirstArticle>let foo = SearchArticles<SecondArticle>

相关内容

最新更新