Tengo el siguiente código Swift 3:

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

Estoy comprobando si el valor en el índice de [número] es siempre mayor que el valor en el índice [número de + 1]. Estoy recibiendo un error:

Tipo Int no se ajusta a la secuencia de protocolo

Alguna idea?

  • numbers.count - 1 no es una secuencia, que es un número entero. Por lo que no puede ser iterado. Usted necesita algo como for number in numbers. por cierto, ¿qué idioma es este?
  • Swift 3, sé que esto no va a funcionar, pero necesito un comando, que sería bucle de este código para los números.count – 1 veces.
  • for index in numbers.indices { Por CIERTO, tendrás que comprobar si hay otro elemento después de que el índice real if index + 1 < numbers.count { antes de intentar acceder al siguiente elemento de la matriz
InformationsquelleAutor Toby V. | 2017-02-05

4 Comentarios

  1. 23

    Puede ser rápido.
    Usted puede utilizar esta iteración.

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

    El error es porque Int no es un Sequence. Usted puede crear un rango como ya se ha sugerido, que no se ajustan a una secuencia y permitirá iteración utilizando for in.

    Una manera de hacer Int conforme a una secuencia es:

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

    Que luego permitirá usarlo como una secuencia con for in.

    for i in 5 {
        print(i)
    }

    pero yo no recomendaría hacer esto. Es solo para demostrar el poder de los protocolos, pero probablemente sería confuso en una base de código.

    De ejemplo, parece que estás tratando de comparar consecutivos elementos de la colección. Una costumbre iterador puede hacer solo que manteniendo el código bastante legible:

    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())
        }
    }

    que puede ser utilizado como:

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

    En el ejemplo anterior, el iterador se van más de los siguientes pares:

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

    Este tal vez un poco tarde, pero que podría haber hecho:

    for number in numbers { }

    lugar de:

    for number in numbers.count - 1 { }

    Para un bucle for para trabajar una secuencia de (rango) es necesario. Una secuencia consta de una indica un valor, un valor final y todo lo demás. Esto significa que un bucle for puede ser dicho bucle a través de una gama con éter

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

    Ejemplo dar la nesasery secuencias. Donde:

     for number in numbers.count - 1 { }

    Sólo le da un valor que bien podría ser el de partida o el valor final, lo que es imposible averiguar a cuántos vez que el bucle for se tiene que ejecutar.

    Para obtener más información, consulte Apple swift de control de flujo documnetation

  4. 0

    El error es porque número no es un índice, pero el elemento de la matriz en cada iteración. Puede modificar el código como este:

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

    O hay un truco mediante el método de ordenación, pero ese es un tipo de hack (y sí, los subíndices están bien, pero mira como invertida; usted puede probar esto directamente en un Patio de recreo):

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

Dejar respuesta

Please enter your comment!
Please enter your name here