let names = ["Anna", "Alex", "Brian", "Jack"] for name in names { print("Hello, \(name)!") } // Hello, Anna! // Hello, Alex! // Hello, Brian! // Hello, Jack!
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4] for (animalName, legCount) in numberOfLegs { print("\(animalName)s have \(legCount) legs") } // ants have 6 legs // cats have 4 legs // spiders have 8 legs
for index in1...5 { print("\(index) times 5 is \(index *5)") } // 1 times 5 is 5 // 2 times 5 is 10 // 3 times 5 is 15 // 4 times 5 is 20 // 5 times 5 is 25
let minutes =60 for tickMark in0..<minutes { // render the tick mark each minute (60 times) }
如果只需要循环次数而不需要值可以用下划线标注参数名。
let base =3 let power =10 var answer =1 for_in1...power { answer *= base } print("\(base) to the power of \(power) is \(answer)") // Prints "3 to the power of 10 is 59049"
let minuteInterval =5 for tickMark instride(from: 0, to: minutes, by: minuteInterval) { // render the tick mark every 5 minutes (0, 5, 10, 15 ... 45, 50, 55) }
to 是不包含在内的,如需包含可以使用 through。
let hours =12 let hourInterval =3 for tickMark instride(from: 3, through: hours, by: hourInterval) { // render the tick mark every 3 hours (3, 6, 9, 12) }
While 循环
做一些变量准备。
let finalSquare =25 var board = [Int](repeating: 0, count: finalSquare +1)
var square =0 var diceRoll =0 while square < finalSquare { // roll the dice diceRoll +=1 if diceRoll ==7 { diceRoll =1 } // move by the rolled amount square += diceRoll if square < board.count { // if we're still on the board, move up or down for a snake or a ladder square += board[square] } } print("Game over!")
Repeat-While 循环
至少做一次再判断条件。
repeat { // move up or down for a snake or ladder square += board[square] // roll the dice diceRoll +=1 if diceRoll ==7 { diceRoll =1 } // move by the rolled amount square += diceRoll } while square < finalSquare print("Game over!")
If 没什么好说的
Switch
没什么好说的。特殊点是当存在一个匹配值之后会直接跳出,不需要 break。
let someCharacter: Character="z" switch someCharacter { case"a": print("The first letter of the alphabet") case"z": print("The last letter of the alphabet") default: print("Some other character") } // Prints "The last letter of the alphabet"
多条件匹配。
let anotherCharacter: Character="a" switch anotherCharacter { case"a", "A": print("The letter A") default: print("Not the letter A") } // Prints "The letter A"
case 可以做更多功能性匹配。
let approximateCount =62 let countedThings ="moons orbiting Saturn" let naturalCount: String switch approximateCount { case0: naturalCount ="no" case1..<5: naturalCount ="a few" case5..<12: naturalCount ="several" case12..<100: naturalCount ="dozens of" case100..<1000: naturalCount ="hundreds of" default: naturalCount ="many" } print("There are \(naturalCount)\(countedThings).") // Prints "There are dozens of moons orbiting Saturn."
元组也能匹配。
let somePoint = (1, 1) switch somePoint { case (0, 0): print("\(somePoint) is at the origin") case (_, 0): print("\(somePoint) is on the x-axis") case (0, _): print("\(somePoint) is on the y-axis") case (-2...2, -2...2): print("\(somePoint) is inside the box") default: print("\(somePoint) is outside of the box") } // Prints "(1, 1) is inside the box"
在符合条件的情况下还能绑定值。
let anotherPoint = (2, 0) switch anotherPoint { case (let x, 0): print("on the x-axis with an x value of \(x)") case (0, let y): print("on the y-axis with a y value of \(y)") caselet (x, y): print("somewhere else at (\(x), \(y))") } // Prints "on the x-axis with an x value of 2"
用 where 关键字进行更灵活的操作。
let yetAnotherPoint = (1, -1) switch yetAnotherPoint { caselet (x, y) where x == y: print("(\(x), \(y)) is on the line x == y") caselet (x, y) where x ==-y: print("(\(x), \(y)) is on the line x == -y") caselet (x, y): print("(\(x), \(y)) is just some arbitrary point") } // Prints "(1, -1) is on the line x == -y"
控制转换语句
continue
break
fallthrough
return
throw
其他不多说。在 Switch 如果不想匹配一个就走,可以用 fallthrough 继续往后匹配。
let integerToDescribe =5 var description ="The number \(integerToDescribe) is" switch integerToDescribe { case2, 3, 5, 7, 11, 13, 17, 19: description +=" a prime number, and also" fallthrough default: description +=" an integer." } print(description) // Prints "The number 5 is a prime number, and also an integer."
gameLoop: while square != finalSquare { diceRoll +=1 if diceRoll ==7 { diceRoll =1 } switch square + diceRoll { case finalSquare: // diceRoll will move us to the final square, so the game is over break gameLoop caselet newSquare where newSquare > finalSquare: // diceRoll will move us beyond the final square, so roll again continue gameLoop default: // this is a valid move, so find out its effect square += diceRoll square += board[square] } } print("Game over!")
检查 API 可用性
下面的写法可以判断 API 的可用性,并且在不同情况下采取不同的措施。
if#available(iOS10, macOS10.12, *) { // Use iOS 10 APIs on iOS, and use macOS 10.12 APIs on macOS } else { // Fall back to earlier iOS and macOS APIs }