议定书不符合自己的要求?

议定书不符合自己的要求?

为什么这个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()

编译器说:“类型P不符合协议P”(或者,在Swift的更高版本中,“不支持使用'P'作为符合协议'P'的具体类型。”)。

为什么不?不知怎的,这感觉就像语言中的漏洞。我意识到问题源于将数组声明arr协议类型的数组,但这是不合理的事情吗?我认为协议正是为了帮助提供类似层次结构的结构?


慕村9548890
浏览 757回答 3
3回答

繁星coding

如果您将CollectionType协议扩展而不是Array协议约束作为具体类型,则可以按如下方式重写以前的代码。protocol&nbsp;P&nbsp;{&nbsp;}struct&nbsp;S:&nbsp;P&nbsp;{&nbsp;}let&nbsp;arr:[P]&nbsp;=&nbsp;[&nbsp;S()&nbsp;]extension&nbsp;CollectionType&nbsp;where&nbsp;Generator.Element&nbsp;==&nbsp;P&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;func&nbsp;test<T>()&nbsp;->&nbsp;[T]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;}}let&nbsp;result&nbsp;:&nbsp;[S]&nbsp;=&nbsp;arr.test()
打开App,查看更多内容
随时随地看视频慕课网APP