本文介绍了定义一个需要特定类型序列的Swift协议的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我们正在讨论Int类型的元素(但问题仍然适用于任何类型)。

我有一些功能需要循环遍历Ints的序列。但我并不在乎在幕后这个序列是以数组,或者集合还是任何其他奇特类型的结构实现的,唯一的要求就是我们可以在它们上面循环。



Swift标准库将协议SequenceType定义为可以用for ... in循环迭代的类型。所以我的直觉是定义一个像这样的协议:

  protocol HasSequenceOfInts {
var seq:SequenceType< Int> {get}
}

但这不起作用。 SequenceType不是可以专用的通用类型,而是一种协议。任何特定的SequenceType does 都有一个特定类型的元素,但它只能作为关联的类型使用:SequenceType.Generator.Element



是:

我们如何定义需要特定类型序列的协议?

以下是我尝试过的其他一些事情,以及他们为什么不对:

失败1

  protocol HasSequenceOfInts {
var seq:SequenceType {get}
}


不合格2

  protocol HasSequenceOfInts {
var seq:AnySequence< Int> {get}
}
class ArrayOfInts:HasSequenceOfInts {
var seq:[Int] = [0,1,2]
}

我认为这个可以工作,但是当我尝试使用Array的具体实现时,我们得到了

这是因为Array是不是AnySequence(令我惊讶......我的期望是AnySequence会匹配任何Ints序列)
$ b

失败3

 协议HasSequenceOfInts {
typealias S:SequenceType
var seq:S {get}
}

编译,但没有义务序列seq的元素具有类型Int



失败4

 协议HasSequenceOfInts {
var seq:SequenceType其中S.Generator.Element == Int
}

不能在那里使用where子句



所以现在我完全没有想法。我可以很容易地让我的协议需要一个Int数组,但是我没有任何理由限制实现,而且这种感觉非常迅速。



更新成功



请参阅@ rob-napier的解答,这很好地解释了这些问题。我的失败2非常接近。使用AnySequence可以工作,但是在您的合格课程中,您需要确保将您使用的任何顺序转换为AnySequence。例如:

  protocol HasSequenceOfInts {
var seq:AnySequence< Int> {get}
}
class ArrayOfInts:HasSequenceOfInts {
var _seq:[Int] = [0,1,2]
var seq:AnySequence< Int> {
get {
return AnySequence(self._seq)
}
}
}


解决方案

这个问题有两个方面:

08-14 03:51