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() {
}
我在 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() {
}