补充一下Swift的相关知识。

字符型

字符型只能包含一个字符

1
var f: Character = "A"

查看变量的类型

1
type(of: a)

单行注释和多行注释

1
2
3
4
5
6
//单行注释

/*
多行注释
多行注释
*/

可选类型

1
var a: Int? = 2

类型转换

在类型转换的时候可能会出现Optional类型,解决的方法为使用??语法,如果确定有值的时候可以使用!

1
2
3
4
print(Int("123123")) -> Optional(123123)
print(Int("123123") ?? 10) -> 123123
print(Int("hello") ?? 10) -> 10
print(Int("12")!) -> 12

例:

1
2
3
4
5
6
7
8
9
var a: Int? = 2

if a == nil {
print("a没有值")
}else{
print("a的值为:\(a!)")

print("a的值为:" + String(a!))
}

元组

元组是将多个类型的值封装到一个变量之中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var a = ("hello", 12, false, 12.5)
var b: (String, Int) = ("hi", 12)
b.1 = 99

print(a.0)
print(b.1)

/*
hello
99
*/

//我们可以给元组起名
var c = (name1: "hi", name2: 1212)

print(c)
print(c.name1)
print(c.0)

//也可以在声明时取名
var d: (name1: String, name2: Int) = ("hello", 12)

print(d.name1)

//我们利用元组直接创建变量或常量
let (name1, name2) = ("Hello", 12)

print(name1)

//也可以使用下划线忽略
let (name1, _, name2) = ("Hello", true, 12)

print(name1, name2)

可选项绑定

判断可选项是否为空,如果不为空则继续执行

1
2
3
4
5
6
7
8
9
10
let hello: Int? = 12

if let txt = hello {
print(txt)
}
/*
else{

}
*/

隐式展开

在已经知道该变量有值的时候,可以使用!

1
2
3
4
5
6
7
8
9
10
let a: Int![]= 12
let b: Int = a

print(b)

//或者写成
let c: Int? = 14
let d = c!

print(d)

Switch case 和 fallthrough 穿透效果

使用fallthrough可以执行完改case后顺序执行下一个case

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let num = 11

switch num {
case 11:
print("情况1")
fallthrough
case 12:
print("情况2")
case 13:
print("情况3")
default:
print("没有匹配")
}

Switch case 元组拆分匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let num = (12, true)

switch num {
case let(name1, false):
print(name1)
case let(12, name2):
print(name2)
default:
print("没有匹配")
}

/*
true
*/

switch case 使用 where 创建例外情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let a = (10, 20)

switch a {
case let(name1, name2) where name1 > name2:
print(name1 - name2)
case let(10, name2):
print(10 + name2)
default:
print("不符合要求")
}

/*
输出:
30
*/

每隔n个值取一个数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//不包含结尾
for num in stride(from: 0, to: 10, by: 2){
print(num)
}

/*
输出:
0
2
4
6
8
*/

//包含结尾
for num in stride(from: 0, through: 9, by: 3){
print(num)
}

/*
输出:
0
3
6
9
*/

//反向
for num in stride(from: 0, through: 9, by: 3).reversed(){
print(num)
}

/*
输出
9
6
3
0
*/

跳过单次循环和终止本次循环

跳过循环/终止循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for num in 0...12 {
if num == 3 {
continue
}
if num == 5 {
break
}

print(num)
}

/*
输出:
0
1
2
4
*/

repeat while 循环

先运行一遍再判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var a = 0
var b = true

repeat {
print(a)
a += 1

if a == 5 {
b.toggle()
}
}while b

/*
输出:
0
1
2
3
4
*/

关于一些String的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
import Cocoa
// 字符串长度
var str = "ABCDEF"
print(str.count)

/*
6
*/

//字符串开头字符
print(str[str.startIndex]) //str.startIndex为开头

/*
A
*/

//字符串结尾字符
print(str[str.index(before: str.endIndex)]) // str.endIndex指的是最后一个字母后面的值,所以用index的before来取最后一个字母
print(str[str.index(after: str.startIndex)]) // 取第二个字母

/*
F
B
*/

//根据索引取任意位置字符
print(str[str.index(str.startIndex, offsetBy: 3)]) //取索引为3的字符,索引从0开始

/*
D
*/

//字符串区间
var a = str.index(str.startIndex, offsetBy: 2)
var b = str.index(str.startIndex, offsetBy: 5)

print(str[a...b])
print(str[a..<b])

/*
CDEF
CDE
*/

//获取某个字符第一次出现的索引
var c = str.firstIndex(of: "E") ?? str.endIndex //因为是可选值,字符串中不含E则返回nil,所以需要使用??
print(str[str.startIndex...c])

/*
ABCDE
*/

//获取从索引0开始,长度为4的字符
print(str.prefix(4))

/*
ABCD
*/

//获取后两位字符
print(str[str.index(str.endIndex, offsetBy: -2)..<str.endIndex])

/*
EF
*/

//查找字符串是否包含某字符
print(str.contains("CD"))
print(str.contains("G"))

/*
true
false
*/

//查找字符串中是否包含某个字符串中的某个字符
print(str.contains(where: String.contains("AKK")))
print(str.contains(where: String.contains("KKK")))

/*
true
false
*/

//判断前缀是否为字符串
print(str.hasPrefix("ABC"))
print(str.hasSuffix("EF"))

/*
true
true
*/

//追加字符串
str.append("sssssssss")
print(str)

/*
ABCDEFsssssssss
*/

str = String(str.prefix(6)) //str = "ABCDEF"

//插入字符串
str.insert(contentsOf: "OPQ", at: str.index(str.startIndex, offsetBy: 4))
print(str)

/*
ABCDOPQEF
*/

//根据索引修改字符串
str = "ABCDEF" //初始化
let d = str.firstIndex(of: "B") ?? str.startIndex
let e = str.firstIndex(of: "E") ?? str.index(before: str.endIndex)

str.replaceSubrange(d...e, with: "123123")

print(str)

/*
ABCD123123EF
*/

//根据字符串替换字符串
str = "ABCDEF" //初始化
str.replacingOccurrences(of: "ABC", with: "888")
print(str)

/*
ABCDEF
*/

//根据索引删除字符
str = "ABCDEF" //初始化
str.remove(at: str.index(str.startIndex, offsetBy: 2))
print(str)

/*
ABDEF
*/

//根据范围删除字符
str = "ABCDEF" //初始化
str.removeSubrange(str.index(str.startIndex, offsetBy: 1)...str.index(str.startIndex, offsetBy: 3))
print(str)

/*
AEF
*/

//直接遍历字符串
str = "ABCDEF" //初始化
for item in str {
print(item)
}

/*
A
B
C
D
E
F
*/

//用索引遍历字符串
for item in 0..<str.count {
print(str[str.index(str.startIndex, offsetBy: item)])
}

/*
A
B
C
D
E
F
*/

//多行文本
var mtxt = """
hello
world
"""

print(mtxt)

/*
hello
world
*/

//无视转译符号输出字符串
var utxt = #""hello\ntxt"#
print(utxt)

/*
"hello\ntxt
*/

参考资料

Swift编程基础