gpt4 book ai didi

ios - Swift 中带有生成器和序列的泛型

转载 作者:搜寻专家 更新时间:2023-10-30 22:23:51 25 4
gpt4 key购买 nike

我对 OO 编程和 Swift 有相当好的理解,但是,真正让我感到困惑的一个领域是 GeneratorsSequences(我对顺便提一下协议(protocol))。

例如,我从 Swift Guide (Apple) 完成了这个练习

“实验修改 anyCommonElements 函数以创建一个返回任意两个序列共有元素的数组的函数。”

转动这个:

func​ ​anyCommonElements​ <​T​, ​U​ ​where​ ​T​: ​SequenceType​, ​U​: ​SequenceType​, ​T​.​Generator​.​Element​: ​Equatable​, ​T​.​Generator​.​Element​ == ​U​.​Generator​.​Element​> (​lhs​: ​T​, ​rhs​: ​U​) -> ​Bool​ {   
for​ ​lhsItem​ ​in​ ​lhs​ {
for​ ​rhsItem​ ​in​ ​rhs​ {
if​ ​lhsItem​ == ​rhsItem​ {
return​ ​true
}
}
}
return​ ​false
}

进入这个:

func anyCommonElements <T, U where T: SequenceType, U: SequenceType, T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element> (lhs: T, rhs: U) -> [T.Generator.Element]? {
var commonElements:[T.Generator.Element]? = nil
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
if (commonElements == nil)
{
commonElements = [] //init the array if not already
}
commonElements?.append(lhsItem) //add matching item to the array
}
}
}
return commonElements? //return nil or array of matched elements
}

我对我编写的解决方案很满意,它运行良好,包括 Optional 返回,但是我不知道为什么 commonElements 返回数组的类型需要这样:

var commonElements:[T.Generator.Element]

而不是这个:

var commonElements:[T]

我读过很多关于这个主题的文章,包括:

https://schani.wordpress.com/2014/06/06/generators-in-swift/

http://robots.thoughtbot.com/swift-sequences

http://natashatherobot.com/swift-conform-to-sequence-protocol/

但我仍然完全迷失了 - 谁能用简单的术语帮助解释一下,还是有点抽象,不容易描述?

非常感谢,谢谢,约翰

Swift 5 更新:(使用 Sequence 代替 SequenceType,使用 Iterator 代替 Generator,以及新的 Where语法。

func anyCommonElements <T, U> (lhs: T, rhs: U) -> [T.Iterator.Element] where T: Sequence, U: Sequence, T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element {
var commonElements:[T.Iterator.Element] = []
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
commonElements.append(lhsItem) //add matching item to the array
}
}
}
return commonElements //return nil or array of matched elements
}

事实上,您现在可以只做 T.Element,而忘掉 Iterator。

最佳答案

T 是一个序列类型。为简单起见,我们以一个特殊且熟悉的情况为例,假设 T 是一个数组。

那么数组中包含的东西的类型就是T.Generator.Element。这是因为 Array 结构的定义方式。请记住,Array 是一个泛型。它是一个 SequenceType,它是一个具有空类型别名 Generator 的(通用)协议(protocol),它被限制为一个 GeneratorType,而后者又是一个具有空类型别名 Element 的(通用)协议(protocol)。当泛型被专门化时,那些空类型别名被“填充”为实际类型。所有的序列都是这样。因此,如果 T 是数组,则 T.Generator.Element 表示“this 数组的 actualactual 类型元素”。

因此 [T.Generator.Element] 的意思是“与原始数组的元素具有相同类型元素的数组。”

您建议的表达式 [T] 表示一个数组 的数组,这不是我们想要的。

好的,现在将 T 概括为任何序列(数组、字符串等),并且该解释继续有效。

关于ios - Swift 中带有生成器和序列的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27968880/

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