Swift Language
Loops
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
Om du behöver indexet för varje element i matrisen kan du använda metoden enumerate()
på 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.
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
Du kan använda metoden reverse()
på 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
I Swift 3 har reverse()
bytt namn till reversed()
:
for i in (0..<3).reversed() {
print(i)
}
Iterating över intervall med anpassade steg
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
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
-
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
-
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)