SwifT:无法将通用协议作为参数的通用函数

约坦

假设我有这个简单的通用协议

protocol FooProtocol {
    associatedtype Element: CustomStringConvertible

    func echo(element: Element) -> Element
}

和实现它的这个简单的通用结构

struct FooStruct<Element: CustomStringConvertible>: FooProtocol {
    func echo(element: Element) -> Element {
        return element
    }
}

最后,我具有以下功能:

func callEcho<T: FooProtocol>(container: T) {
    container.echo(element: "some string")
}

这导致 error: cannot invoke 'echo' with an argument list of type '(element: String)'

解决方案是将功能更改为

func callEcho<T: FooProtocol>(container: T) where T.Element == String {
    container.echo(element: "some string")
}

我的问题是:为什么where T.Element == String约束是必要的?编译器知道这T是一个实现的实体FooProtocol,而协议仅要求Element实现CustomStringConvertible,这是我的字符串文字所做的。那么,为什么没有约束就行不通呢?

谢谢!

罗布·纳皮尔

我不确定为什么要说“该协议只要求Element实现CustomStringConvertible”。该协议要求echo接受并返回Element,该Element可以是String,也可以不是。例如,我可以实现以下符合类型:

struct AnotherFoo: FooProtocol {
    func echo(element: Int) -> Int { fatalError() }
}

因此,如果我随后致电:

callEcho(container: AnotherFoo())

这将尝试将字符串文字传递给需要Int的函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift协议作为通用参数

来自分类Dev

Swift:如何将通用协议作为另一个协议的参数传递

来自分类Dev

Swift通用协议功能参数

来自分类Dev

如何在Swift中将具有关联类型的协议(通用协议)作为参数传递?

来自分类Dev

如何将通用结构作为函数参数

来自分类Dev

如何在通用函数中使用Swift通用Decodable协议

来自分类Dev

Swift - 将通用代码重构为协议

来自分类Dev

将通用参数作为参数传递

来自分类Dev

C ++中将多态(通用)函数作为参数

来自分类Dev

通用作为构造函数的参数

来自分类Dev

Swift无法将符合协议的类作为函数参数传递给Objective-C文件中的函数

来自分类Dev

Swift 通用枚举作为转义闭包的参数,即函数的参数

来自分类Dev

具有通用参数类型的Swift函数

来自分类Dev

Swift通用参数“ T”无法推断

来自分类Dev

Swift:无法推断出通用参数

来自分类Dev

Swift:无法推断通用参数“T”

来自分类Dev

将通用集合转换为函数参数

来自分类Dev

Scala:通用函数以未知数量的函数作为参数

来自分类Dev

获取通用函数的参数

来自分类Dev

协议通用

来自分类Dev

可以在Swift 3中将通用协议传递到构造函数中以进行适当的依赖注入吗?

来自分类Dev

Swift 通用函数调用通用函数

来自分类Dev

如何使用通用函数指针作为模板参数?

来自分类Dev

C#通用列表作为构造函数参数

来自分类Dev

如何使用通用函数指针作为模板参数?

来自分类Dev

C#通用列表作为构造函数参数

来自分类Dev

Swift通用构造函数

来自分类Dev

无法将函数分配给具有通用参数的类型

来自分类Dev

Java通用枚举作为参数

Related 相关文章

热门标签

归档