一、if-else
- if后面的条件可以省略小括号
- 条件后面的大括号不可以省略
let age = 10
if age >= 18 {
print("大学")
} else if age >= 16 {
print("高中")
} else {
print("义务")
}
- if后面的条件只能是Bool类型
二、while
代码语言:javascript复制var num = 3
while num > 0 {
print("num is (num)")
num -= 1
}
/*
输出:
num is 3
num is 2
num is 1
*/
- swift中没有
do-while
,相同逻辑的是repeat-while
- swift3开始,去除了自增( ),自减(--)运算符
- 不要再使用
num
,num--
,num
,--num
等运算符了 - 自增自减运算符在不同平台有不一样的效果,所以swift放弃了使用
- 不要再使用
var num = -1
repeat {
print("num is (num)")
} while num > 0
/*
输出:num is -1
*/
三、for
3.1. 区间运算符
格式:a...b
(a <= 取值 <= b)
- 变量默认是let修饰,可以自己根据情况修改为var
// 常规用法
let words = ["aaa", "bbb", "ccc", "ddd"]
for i in words {
print(i);
}
/*
输出:
aaa
bbb
ccc
ddd
*/
// 区间用法
for i in 1...3 {
print(i, words[i])
}
/*
输出:
1 bbb
2 ccc
3 ddd
*/
// var修饰
for var i in 1...3 {
i = 5
print(i)
}
/*
输出:
6
7
8
*/
// 区间定义常量
let range = 1...3
for i in range {
print(i)
}
/*
输出:
1
2
3
*/
// 区间值自定义
let a = 1
let b = 3
for i in a...b {
print(i)
}
/*
输出:
1
2
3
*/
3.2. 半开区间运算符
格式:a..<b
(a <= 取值 < b)
for i in 1..<3 {
print(i)
}
/*
输出:
1
2
*/
3.3. 区间运算符用在数组上
代码语言:javascript复制// 此处只是示例用法,实际应用时应注意数组越界
let words = ["aaa", "bbb", "ccc", "ddd"]
for i in words[0...3] {
print(i);
}
3.4 单侧区间:让区间朝一个方向尽可能的远
代码语言:javascript复制// 常规闭区间
let words = ["aaa", "bbb", "ccc", "ddd"]
for word in words[0...3] {
// print(word);
}
/*
输出:
aaa
bbb
ccc
ddd
*/
// 左边代表开始,右边代表数组最大长度
for word in words[2...] {
print(word)
}
/*
输出:
ccc
ddd
*/
// 左边代表0,右边闭区间值
for word in words[...2] {
print(word)
}
/*
输出:
aaa
bbb
ccc
*/
// 左边代表0,右边<2
for word in words[..<2] {
print(word)
}
/*
输出:
aaa
bbb
*/
// 无限制,range左边是无穷小的整数
let range = ...5
print(range.contains(7)) // false
print(range.contains(1)) // true
print(range.contains(-2)) // true
四、区间类型(Range)
- 范围代表的是两个值的区间,它由上下边界进行定义;
- 不能对 Range 或者 ClosedRange 进行迭代,但是我们可以检查某个元素是否存在于范围中;
- Range 和 ClosedRange 既非序列,也不是集合类型。有一部分范围确实是序列是因为 0..<10 的类型其实是一个 CountableRang。CountableRange 和 Range 很相似,只不过它还需要一个附加约束:它的元素类型需要遵守 Strideable 协议 (以整数为步⻓)。Swift 将这类功能更强的范围叫做可数范围,这是因为只有这 类范围可以被迭代。可数范围的边界可以是整数或者指针类型,但不能是浮点数类型,这是由 于 Stride 类型中有一个整数的约束。如果你想要对连续的浮点数值进行迭代的话,你可以通过 使用 stride(from:to:by) 和 stride(from:through:by) 方法来创建序列用以迭代。
-- | 半开 | 闭合 |
---|---|---|
Comparable | Range | ClosedRange |
Strideable(以整数为步长) | CountableRange | CountableClosedRange |
4.1. 同时省略掉上、下两个边界,这样你将会得到整个集合类型的切片
代码语言:javascript复制let arr = [1,2,3,4]
arr[...] // [1, 2, 3, 4]
type(of: arr) // Array<Int>
代码语言:javascript复制// 半开区间
let rang: Range = 0.0..<1.0
let countableRange: CountableRange = 0..<1
// 闭区间
let closedRange: ClosedRange = 0.0...1.0
let countableClosedRange: CountableClosedRange = 0...1
// 右侧闭区间
let partialRangeThrough: PartialRangeThrough = ...1.0
// 左侧闭区间
let partialRangeFrom: PartialRangeFrom = 0.0...
// 右侧开区间
let partialRangeUpTo: PartialRangeUpTo = ..<1.0
// 左侧闭区间
let countablePartialRangeFrom: CountablePartialRangeFrom = 1...
4.2. 字符、字符串也能使用区间运算符,但默认不能用在for-in中
代码语言:javascript复制let stringRange1 = "cc"..."ff"
stringRange1.contains("cb") // false
stringRange1.contains("dz") // true
stringRange1.contains("e") // true
stringRange1.contains("fg") // false
let stringRange2 = "a"..."f"
stringRange2.contains("a") // true
stringRange2.contains("e") // true
stringRange2.contains("g") // false
// 到~囊括了所有可能要用到的ASCII字符
let characterRange: ClosedRange<Character> = "