相关疑难解决方法(0)

定义一个需要特定类型序列的Swift协议

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

我有一些功能需要循环一系列Ints.但我不在乎幕后这个序列是作为一个数组,或一个Set或任何其他奇特的结构实现,唯一的要求是我们可以循环它们.

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

protocol HasSequenceOfInts {
    var seq : SequenceType<Int> { get }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.SequenceType不是可以专用的泛型类型,它是一种协议.任何特定的SequenceType 具有特定类型的元素,但它仅作为关联类型提供:SequenceType.Generator.Element

所以问题是:

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

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

失败1

protocol HasSequenceOfInts {
    var seq : SequenceType { get }
}
Run Code Online (Sandbox Code Playgroud)

协议'SequenceType'只能用作通用约束,因为它具有Self或相关类型要求

失败2

protocol HasSequenceOfInts {
    var seq : AnySequence<Int> { get }
}
class ArrayOfInts : HasSequenceOfInts {
    var seq : [Int] = [0,1,2]
}
Run Code Online (Sandbox Code Playgroud)

我认为这个可行,但是当我尝试使用数组的具体实现时,我们得到了

类型'ArrayOfInts'不符合协议'HasSequenceOfInts'

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

失败3

protocol HasSequenceOfInts {
    typealias S : SequenceType
    var seq : S { get }
}
Run Code Online (Sandbox Code Playgroud)

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

失败4 …

generics protocols swift

12
推荐指数
1
解决办法
2904
查看次数

标签 统计

generics ×1

protocols ×1

swift ×1