我使用关联类型作为协议遇到问题:
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>