使用if和switch进行条件转换,并使用for-in,while和repeat-while进行循环。 条件或循环变量的括号是可选的。 主函数旁边需要花括号。
let individualScore = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScore{
if score > 50{
teamScore += 3
}else{
teamScore += 1
}
}
print(teamScore)
//Print "11"
在if语句中,条件条件必须是布尔表达式-这意味着诸如score {...}之类的代码是错误,而不是与零的隐式比较。
您可以使用if和让它们一起使用可能缺少的值。 这些值表示为可选值。 可选值包含一个值或包含nil来指示缺少一个值。 在值的类型后写一个问号(?),以将该值标记为可选。
var optionalString: String? = "Hello"
print(optionalString == nil)
//Prints "false"
这时候有问号❓,程序不会出现提示,如果不加问号,则出现提示
⚠️Comparing non-optional value of type 'String' to 'nil' always returns false
将类型'String'的非可选值与'nil'进行比较总是返回false
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
print(greeting)
// Prints "Hello, John Appleseed"
var optionalName: String? = nil
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
print(greeting)
// Prints "Hello!"
var optionalName: String? = nil
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}else if optionalName == nil{
greeting = "Good morning!"
}
print(greeting)
// Prints "Good morning!"
如果可选值为nil,则条件为false,并且括号中的代码将被跳过。 否则,可选值将被解包并在let之后分配给常量,这将使解包后的值在代码块内可用。
处理可选值的另一种方法是使用默认值?? 的操作符号。 如果缺少可选值,则使用默认值。
let nickName: String? = nil
let fullName: String = "John Appleseed"
let infotmalGreeting = "Hi \(nickName ?? fullName)"
print(infotmalGreeting)
//Prints "Hi John Appleseed"
如果nickName 的空值改变:
let nickName: String? = "Danny"
let fullName: String = "John Appleseed"
let infotmalGreeting = "Hi \(nickName ?? fullName)"
print(infotmalGreeting)
//Prints "Hi Danny"
结论:?? 符号应该优先判断第一值
Switches 支持任何类型的数据和各种各样的比较操作-它们不仅限于整数和相等性测试。
let vegetalble = "red peper"
switch vegetalble {
case "celery":
print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
print("That would make a good tea sandwith.")
case let x where x.hasSuffix("peper"):
print("This is a spicy \(x)?")
default:
print("Everything tasts good in soup.")
}
//Prints "This is a spicy red peper?"
❗️Switch must be exhaustive
Switch 语法必须穷尽可能
实例方法
hasSuffix(_ :)
返回一个布尔值,该值指示字符串是否以指定的后缀结尾。
func hasSuffix(_ suffix: String) -> Bool
参量
后缀
可能针对此字符串测试的后缀。
返回值
如果字符串以后缀结尾,则为true;否则为false。 否则为假。
讨论区
比较是区分大小写和Unicode安全的。 区分大小写的比较将仅匹配其相应字符具有相同大小写的字符串。
let plans = "Let's meet at the café"
//区分大小写 Case sensitive
print(plans.hasSuffix("cafe"))
//Prints"false"
Unicode安全比较将匹配Unicode标量值,而不是用于组合它们的代码点。 下面的示例使用两个带有不同形式的“é”字符的字符串-第一个使用组合形式,第二个使用分解形式。
let plans = "Let's meet at the café"
// Unicode safe
let composedCafe = "café"
// \u 十六进制
let decomposedCafe = "cafe\u{0301}"
print(plans.hasSuffix(composedCafe))
// Prints "true"
print(plans.hasSuffix(decomposedCafe))
// Prints "true"
这样的结果都是true 了。
注意如何在模板中使用let来将与模式匹配的值分配给常量。
在匹配的switch case中执行代码后,程序将从switch语句退出。 执行不会继续到下一个案例,因此无需在每个案例代码的末尾显式地切换开关。
通过提供一对名称用于每个键值对,可以使用for-in遍历字典中的项目。 字典是无序集合,因此它们的键和值以任意顺序进行迭代。
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (_, numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
}
}
}
print(largest)
// Prints "25"
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
"notable": [29]
]
var largest = 0
for (_, numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
}
}
}
print(largest)
// Prints "29"
使用while重复代码块,直到条件发生变化。 循环的条件可以在末尾,以确保循环至少运行一次。
var n = 2
while n < 100 {
n *= 2
}
print(n)
//Prints"128"
var m = 2
repeat {
m *= 2
}while m < 100
print(m)
//Prints"128"
您可以使用.. <来使索引范围保持循环。
var total = 0
for i in 0..<4 {
total += i
}
print(total)
//Prints"6"
也可以使用...来使索引范围保持循环。
var total = 0
for i in 0...4 {
total += i
}
print(total)
//Prints"10"
使用.. <可以使范围忽略其上限值,使用...可以使范围包括两个值。