Swift 5.2 Control Flow 控制流

使用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"
  • 实验
  • 将optionalName更改为nil。 你得到什么问候? 添加一个else子句,如果optionalName为nil,则设置另一个问候语。
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?"
  • 实验
  • 尝试删除默认情况。 你得到什么错误?

Swift 5.2 Control Flow 控制流_第1张图片

❗️Switch must be exhaustive

Switch 语法必须穷尽可能

实例方法
hasSuffix(_ :)
返回一个布尔值,该值指示字符串是否以指定的后缀结尾。

Declaration

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"

使用.. <可以使范围忽略其上限值,使用...可以使范围包括两个值。

你可能感兴趣的:(Swift)