gpt4 book ai didi

ios - 接受类型序列的函数

转载 作者:搜寻专家 更新时间:2023-10-31 08:06:18 25 4
gpt4 key购买 nike

我想要一个接受 Int 序列的函数。这是我想写的:

func process(items: Sequence<Int>) {
items.forEach { ... }
}

Error: "Cannot specialize non-generic type 'Sequence'".

更正(我认为):

func process<S: Sequence>(items: S) where S.Iterator.Element == Int {
items.forEach { ... }
}

比较冗长。

我知道 Sequence 协议(protocol)有一个相关联的 Iterator 类型,它有 Element。但我不太清楚为什么我必须以这种奇怪的方式解决 Int 要求。

使第一个版本不起作用但使第二个版本起作用的基本概念是什么?错误是什么意思?

最佳答案

您的问题与通用类型关联类型 之间的区别有关。参见 here (标题为“Generic Types”、“Associated Types”的部分)以基本解释它们在 Swift 中的用途。协议(protocol),如 Sequence,使用关联类型,而不是泛型类型。如果 Sequence 是具有泛型类型的具体类,您的第一个代码示例就有意义 - 这种差异应该可以解释错误消息。

至于为什么协议(protocol)使用关联类型而不是泛型类型,请参阅 this question 的最佳答案.从本质上讲,尽管它们似乎服务于相同的目的,但关联类型意味着更灵活和更具描述性,而泛型类型是关于实现的。这会使您的代码示例更加冗长,但总的来说,会使许多代码示例更加简单。

事实上,来自Sequence source code , Sequence 有一个关联类型 Iterator,它符合 IteratorProtocol 协议(protocol),它又有自己的关联类型 Element(可以是任何类型)。

关于ios - 接受类型序列的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39706041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com