为什么这个Swift代码没有编译?
protocol P { }
struct S: P { }
let arr:[P] = [ S() ]
extension Array where Element : P {
func test<T>() -> [T] {
return []
}
}
let result : [S] = arr.test()
Run Code Online (Sandbox Code Playgroud)
编译器说:"类型P不符合协议P"(或者,在Swift的更高版本中,"不支持使用'P'作为符合协议'P'的具体类型.").
为什么不?不知怎的,这感觉就像语言中的漏洞.我意识到问题源于将数组声明arr为协议类型的数组,但这是不合理的事情吗?我认为协议正是为了帮助提供类似层次结构的结构?
根据我上一个问题的答案,我有 2 个协议\xe2\x80\xa6
\n\nprotocol Filters: Encodable { \n}\n\nprotocol QueryParameters: Encodable {\n associatedtype T: Filters\n var page: Int { get }\n var filters: T { get }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然后对于类型Transaction,我有\xe2\x80\xa6
struct TransactionFilters: Filters {\n var isWithdrawal: Bool\n}\n\nstruct TransactionParamters<T: Filters>: QueryParameters {\n var page: Int\n var filters: T\n}\nRun Code Online (Sandbox Code Playgroud)\n\n到目前为止一切都很好。
\n\n接下来我添加一个协议 ,Filterable并且我希望任何符合该协议的类型都Filterable能够返回参数,如下所示\xe2\x80\xa6
protocol Filterable {\n func parameters() -> QueryParameters\n}\n\nstruct Transactions: Filterable {\n func parameters() -> QueryParameters {\n let transactionFilters = TransactionFilters(isWithdrawal: …Run Code Online (Sandbox Code Playgroud)