Int类型不符合协议顺序

Type Int does not conform to protocol sequence

我在 Swift 3 中有以下代码:

var numbers = [1,2,1]
for number in numbers.count - 1 { // error
    if numbers[number]  < numbers[number + 1] {
        print(number)
    }
}

我正在检查索引 [number] 上的值是否总是高于索引 [number + 1] 上的值。我收到一个错误:

Type Int does not conform to protocol sequence

有什么想法吗?

可能是swift。 您可以使用此迭代。

for number in 0..<(numbers.count-1)

错误是因为 Int 不是 Sequence。您可以按照已经建议的那样创建一个范围,它确实符合一个序列,并且允许使用 for in.

进行迭代

使 Int 符合序列的一种方法是:

extension Int: Sequence {
    public func makeIterator() -> CountableRange<Int>.Iterator {
        return (0..<self).makeIterator()
    }
}

这将允许将其用作 for in 的序列。

for i in 5 {
    print(i)
}

但我不建议这样做。它只是为了展示协议的强大功能,但在实际代码库中可能会造成混淆。

从你的例子来看,你似乎在尝试比较集合中的连续元素。自定义迭代器可以做到这一点,同时保持代码的可读性:

public struct ConsecutiveSequence<T: IteratorProtocol>: IteratorProtocol, Sequence {
    private var base: T
    private var index: Int
    private var previous: T.Element?

    init(_ base: T) {
        self.base = base
        self.index = 0
    }

    public typealias Element = (T.Element, T.Element)

    public mutating func next() -> Element? {
        guard let first = previous ?? base.next(), let second = base.next() else {
            return nil
        }

        previous = second

        return (first, second)
    }
}

extension Sequence {
    public func makeConsecutiveIterator() -> ConsecutiveSequence<Self.Iterator> {
        return ConsecutiveSequence(self.makeIterator())
    }
}

可用作:

for (x, y) in [1,2,3,4].makeConsecutiveIterator() {
    if (x < y) {
        print(x)
    }
}

在上面的示例中,迭代器将遍历以下对:

(1, 2)
(2, 3)
(3, 4)

错误是因为number不是索引,而是每次迭代时数组的元素。您可以这样修改您的代码:

var numbers = [1,2,1,0,3]
for number in 0..<numbers.count - 1 {
    if numbers[number] < numbers[number + 1] {
        print(numbers[number])
    }
}

或者有一个使用 sort 方法的技巧,但那是一种 hack(是的,子索引是正确的,但看起来像倒置的;您可以直接在 Playground 上尝试):

var numbers = [1,2,1,0,3]
numbers.sort {
    if [=11=].1 < [=11=].0 {
        print ([=11=].1)
    }
    return false
}

这可能有点晚了,但你可以做到:

for number in numbers { }

而不是:

for number in numbers.count - 1 { }

要使 for 循环正常工作,需要一个序列(范围)。一个序列由一个陈述值、一个结束值以及介于两者之间的所有内容组成。这意味着可以告诉 for 循环遍历一个带有 ether

的范围
for number in 0...numbers.count-1 { }   `or`   for number in numbers { } 

两个例子都给出了错误的序列。其中:

 for number in numbers.count - 1 { }

只给出一个值,可以是起始值也可以是结束值,因此无法计算出 for 循环需要执行多少次 运行。

有关详细信息,请参阅 Apple's swift control flow documnetation

所以首先你需要了解什么是序列.. 一种提供对其元素的顺序、迭代访问的类型。

序列是一个值列表,您可以一次通过一个值。迭代序列元素的最常见方法是使用 for-in 循环:

设 oneTwoThree = 1...3。 // 序列

for循环其实就是

对于序列中的数字{}

所以你需要使用 对于 0..<(numbers.count-1) {}

中的数字

对我来说,这个错误是在我尝试编写 for 循环时发生的,不是针对数组而是针对数组的单个元素。

例如:

let array = [1,2,3,4]
let item = array[0]

for its in item
{
   print(its)
}

这会产生如下错误:类型 Int 不符合协议 'sequence'

因此,如果您在 for 循环中出现此错误,请检查您是否在循环数组。

如果您尝试枚举数组而不是枚举数组,也会出现此错误。例如:

for (index, element) in [0, 3, 4] { 

}

应该是:

for (index, element) in [0, 3, 4].enumerated() { 

}