簡體   English   中英

類型 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] 上的值。 我收到一個錯誤:

類型 Int 不符合協議序列

任何的想法?

它可能很快。 您可以使用此迭代。

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)

這可能有點晚了,但你可以這樣做:

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 { } 

兩個例子都給出了nesasery序列。 然而:

 for number in numbers.count - 1 { }

只給出一個可能是起始值或結束值的值,因此無法計算 for 循環必須運行多少時間。

有關更多信息,請參閱Apple 的 swift 控制流文檔

如果您嘗試枚舉數組而不是枚舉數組,也會出現此錯誤。 例如:

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

}

應該:

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

}

因此,首先您需要了解什么是序列。一種提供對其元素的順序、迭代訪問的類型。

序列是一個值列表,您可以一次遍歷一個值。 迭代序列元素的最常見方法是使用 for-in 循環:

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

for 循環實際上意味着

對於序列中的數字 {}

所以你需要使用 for number in 0..<(numbers.count-1) {}

錯誤是因為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 方法的技巧,但這是一種黑客(是的,子索引是正確的,但看起來像倒置;你可以直接在 Playground 上嘗試這個):

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

對我來說,當我嘗試編寫 for 循環時發生了這個錯誤,不是為數組而是為數組的單個元素。

例如:

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

for its in item
{
   print(its)
}

這給出了一個錯誤,如:類型Int不符合協議“序列”

因此,如果您在 for 循環中遇到此錯誤,請檢查您是否在循環數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM