Sök…


Syntax

  • för konstant i följd {uttalanden}
  • för konstant i sekvens där tillstånd {uttalanden}
  • för var variabel i sekvens {uttalanden}
  • för _ i följd {uttalanden}
  • för fall låt konstant i följd {uttalanden}
  • för fall låt konstant i sekvens där tillstånd {uttalanden}
  • för fallvariabel i sekvens {uttalanden}
  • medan villkor {uttalanden}
  • upprepa {uttalanden} medan villkoret
  • sequence.forEach (body: (Element) kastar -> Void)

In-loop

Med in - loopen kan du iterera över vilken sekvens som helst.

Iterera över en rad

Du kan upprepa både halvöppna och stängda intervall:

for i in 0..<3 {
    print(i)
}

for i in 0...2 {
    print(i)
}

// Both print:
// 0
// 1
// 2

Iterera över en matris eller uppsättning

let names = ["James", "Emily", "Miles"]

for name in names {
   print(name)
}

// James
// Emily
// Miles
2.1 2.2

Om du behöver indexet för varje element i matrisen kan du använda metoden enumerate()SequenceType .

for (index, name) in names.enumerate() {
   print("The index of \(name) is \(index).")
}

// The index of James is 0.
// The index of Emily is 1.
// The index of Miles is 2.

enumerate() returnerar en lat sekvens som innehåller par av element med på varandra följande Int , med början från 0. Därför kommer dessa nummer med matriser att motsvara det givna indexet för varje element - men detta kanske inte är fallet med andra sorters samlingar.

3,0

I Swift 3 har enumerate() bytt namn till enumerated() :

for (index, name) in names.enumerated() {
   print("The index of \(name) is \(index).")
}

Iterating över en ordbok

let ages = ["James": 29, "Emily": 24]

for (name, age) in ages {
    print(name, "is", age, "years old.")
}

// Emily is 24 years old.
// James is 29 years old.

Iterera omvänt

2.1 2.2

Du kan använda metoden reverse()SequenceType för att iterera över vilken sekvens som är omvänd:

for i in (0..<3).reverse() {
    print(i)
}

for i in (0...2).reverse() {
    print(i)
}

// Both print:
// 2
// 1
// 0

let names = ["James", "Emily", "Miles"]

for name in names.reverse() {
    print(name)
}

// Miles
// Emily
// James
3,0

I Swift 3 har reverse() bytt namn till reversed() :

for i in (0..<3).reversed() {
    print(i)
}

Iterating över intervall med anpassade steg

2.1 2.2

Genom att använda stride(_:_:) -metoderna på Strideable du iterera över ett intervall med en anpassad steg:

for i in 4.stride(to: 0, by: -2) {
    print(i)
}

// 4
// 2

for i in 4.stride(through: 0, by: -2) {
    print(i)
}

// 4
// 2
// 0
1,2 3,0

I Swift 3 har stride(_:_:) -metoderna på Stridable ersatts av den globala stride(_:_:_:) -funktioner:

for i in stride(from: 4, to: 0, by: -2) {
    print(i)
}

for i in stride(from: 4, through: 0, by: -2) {
    print(i)
}

Upprepa-medan-slinga

I likhet med medan-loopen utvärderas endast kontrollutdraget efter loopen. Därför kör slingan alltid minst en gång.

var i: Int = 0

repeat {
   print(i)
   i += 1
} while i < 3

// 0
// 1
// 2

medan slingan

A while loop kommer att utföra så länge villkoret är sant.

var count = 1

while count < 10 {
    print("This is the \(count) run of the loop")
    count += 1
}

Sekvens Typ för varje block

En typ som överensstämmer med SequenceType-protokollet kan iterera igenom dess element inom en stängning:

collection.forEach { print($0) }

Detsamma kan också göras med en namngiven parameter:

collection.forEach { item in
    print(item)
}

* Obs: Kontrollflödesanalyser (t.ex. brytning eller fortsättning) får inte användas i dessa block. En retur kan kallas, och om den kallas kommer den omedelbart att returnera blocket för den aktuella iterationen (ungefär som om en fortsättning skulle göra). Nästa iteration körs sedan.

let arr = [1,2,3,4]

arr.forEach {
    
    // blocks for 3 and 4 will still be called
    if $0 == 2 {
        return
    }
}

In-loop med filtrering

  1. where klausul

Genom att lägga till en where klausul kan du begränsa iterationerna till de som uppfyller det givna villkoret.

for i in 0..<5 where i % 2 == 0 {
    print(i)
}

// 0
// 2
// 4


let names = ["James", "Emily", "Miles"]

for name in names where name.characters.contains("s") {
    print(name)
}

// James
// Miles
  1. case klausul

Det är användbart när du bara behöver iterera genom de värden som matchar ett mönster:

let points = [(5, 0), (31, 0), (5, 31)]
for case (_, 0) in points {
    print("point on x-axis")
}

//point on x-axis
//point on x-axis

Du kan också filtrera valfria värden och ta bort dem om det är lämpligt genom att lägga till ? märke efter bindningskonstant:

let optionalNumbers = [31, 5, nil]
for case let number? in optionalNumbers {
    print(number)
}

//31    
//5

Bryta en slinga

En slinga kommer att utföra så länge villkoret är sant, men du kan stoppa den manuellt med hjälp av break sökord. Till exempel:

var peopleArray = ["John", "Nicole", "Thomas", "Richard", "Brian", "Novak", "Vick", "Amanda", "Sonya"]
var positionOfNovak = 0

for person in peopleArray {
    if person == "Novak" { break }
    positionOfNovak += 1
}

print("Novak is the element located on position [\(positionOfNovak)] in peopleArray.")
//prints out: Novak is the element located on position 5 in peopleArray. (which is true)


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow