# switch tip
switch 支持任意类型的数据以及各种比较操作——不仅仅是整数以及测试相等。
case let x where x.hasSuffix("pepper")
let vegetable = "red pepper"
switch vegetable {
case "celery":
print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
print("Is it a spicy \(x)?")
default:
print("Everything tastes good in soup.")
}
# while tip
至少循环一次用 repeat {} while
哦
//使用 while 来重复运行一段代码直到条件改变。
var n = 2
while n < 100 {
n *= 2
}
print(n)
//循环条件也可以在结尾,保证能至少循环一次。
var m = 2
repeat {
m *= 2
} while m < 100
# 元组
使用元组来生成复合值,比如让一个函数返回多个值。该元组的元素可以用名称或数字来获取。
let (x, y) = (1, 2)
// 现在 x 等于 1,y 等于 2
如果两个元组的元素相同,且长度相同的话,元组就可以被比较。比较元组大小会按照从左到右、逐值比较的
(1, "zebra") < (2, "apple") // true,因为 1 小于 2
(3, "apple") < (3, "bird") // true,因为 3 等于 3,但是 apple 小于 bird
(4, "dog") == (4, "dog") // true,因为 4 等于 4,dog 等于 dog
("blue", false) < ("purple", true) // 错误,因为 < 不能比较布尔类型
Swift 标准库只能比较七个以内元素的元组比较函数。如果你的元组元素超过七个时,你需要自己实现比较运算符。
# 数值型类型转换
通常来讲,即使代码中的整数常量和变量已知非负,也请使用 Int 类型。总是使用默认的整数类型可以保证你的整数常量和变量可以直接被复用并且可以匹配整数类字面量的类型推断。
只有在必要的时候才使用其他整数类型,比如要处理外部的长度明确的数据或者为了优化性能、内存占用等等。使用显式指定长度的类型可以及时发现值溢出并且可以暗示正在处理特殊数据。
#typealias
当你想要给现有类型起一个更有意义的名字时,类型别名非常有用。
typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.max
#可选类型
解析方式
if assumedString != nil {
print(assumedString!) 强制解析
}
if/guard let/var definiteString = assumedString {
print(definiteString)
}
空合运算符(a ?? b)将对可选类型 a 进行空判断,如果 a 包含一个值就进行解包,否则就返回一个默认值 b
空合运算符是对以下代码的简短表达方法:
a != nil ? a! : b
let defaultColorName = "red"
var userDefinedColorName: String? //默认值为 nil
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName 的值为空,所以 colorNameToUse 的值为 "red"
#断言
断言仅在调试环境运行。在生产环境中,断言的条件将不会进行评估。这个意味着你可以使用很多断言在你的开发阶段,但是这些断言在生产环境中不会产生任何影响。
使用断言进行调试
let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
// 因为 age < 0,所以断言会触发
如果代码已经检查了条件,你可以使用 assertionFailure(_:file:line:) 函数来表明断言失败了,例如:
if age > 10 {
print("You can ride the roller-coaster or the ferris wheel.")
} else if age > 0 {
print("You can ride the ferris wheel.")
} else {
assertionFailure("A person's age can't be less than zero.")
}
#强制执行先决条件
当一个条件可能为假,但是继续执行代码要求条件必须为真的时候,需要使用先决条件。例如使用先决条件来检查是否下标越界,或者来检查是否将一个正确的参数传给函数。
// 在一个下标的实现里...
precondition(index > 0, "Index must be greater than zero.")
# 区间运算符
闭区间运算符 (a...b
) 定义一个包含从 a 到 b(包括 a 和 b)的所有值的区间。a 的值不能超过 b。
半开区间运算符(a..<b)定义一个从 a 到 b 但不包括 b 的区间。 之所以称为半开区间,是因为该区间包含第一个值而不包括最后的值。
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
print("第 \(i + 1) 个人叫 \(names[i])")
}
// 第 1 个人叫 Anna
// 第 2 个人叫 Alex
// 第 3 个人叫 Brian
// 第 4 个人叫 Jack
单侧区间
闭区间操作符有另一个表达形式,可以表达往一侧无限延伸的区间 —— 例如,一个包含了数组从索引 2 到结尾的所有值的区间:
for name in names[2...] {
print(name)
}
// Brian
// Jack
for name in names[...2] {
print(name)
}
// Anna
// Alex
// Brian
for name in names[..<2] {
print(name)
}
// Anna
// Alex
查看一个单侧区间是否包含某个特定的值
let range = ...5
range.contains(7) // false
range.contains(4) // true
range.contains(-1) // true
网友评论