我的博客地址: fengqiangboy.com
文档更新说明:
• 2016年10月07日 v1.0 初稿
0、前言
随着iOS10的发布,相信大部分公司都会把app的适配最低版本直接拉倒iOS8,毕竟维护和开发成本都会省掉不少。
在iOS8上面,有一个重要的特性,就是可以使用swift了,而swift也已经发布了3.0版本,已经相当稳定了,所以,这个时候开始使用swift是一个明智的选择。
这篇文章适合于有一定iOS开发经验的看。
1、常量
- 常量是不需要被改变的,用let关键字声明
- 后面跟着常量的名称,冒号后面表示产量的类型,等号后面表示常量的值。
- 在实际应用当中,一般省略冒号后面的类型声明,swift会自动根据我们的赋值来推断该常量的类型。
let language: String = "Swift"
let introduced: Int = 2014
let isAwesome: Bool = true
2、变量
- 可以被修改的值,我们称为变量
- 在swift中,变量使用var声明,格式和常量的声明一致。
let language = "Swift"
let introduced = 2014
let isAwesome = true
var version = 1
version = 3
isAwesome = false //这行报错
运行上面的代码,可以发现,编译器在最后一行报了错误,因为我们试图修改了一个常量的值。
3、字符串拼接
- swift中直接使用“+”来拼接字符串即可
let conference = "WWDC"
let message = "Hello, " + conference + "!"
// "Hello, WWDC!"
4、字符串插值
- 字符串的拼接不仅仅局限于字符串之间,swift也可以直接把值插入字符串中。
- 把值连接到字符串中,只需要把值放入
\()
中, - 括号内还可以是一个表达式。例如:
\(year + 1)
let conference = "WWDC"
let message = "Hello, \(conference)!"
// "Hello, WWDC!"
let conference = "WWDC"
let year = 2016
let message = "Hello, \(conference) \(year)!"
// "Hello, WWDC 2016!"
let conference = "WWDC"
let year = 2016
let message = "Hello, \(conference) \(year + 1)!"
// "Hello, WWDC 2017!"
5、集合:数组和字典
- swift中,数组和字典的声明方式很相似,
- 为了安全,我们可以在名字后面声明类型。
let names: [String] = ["Lily", "Santiago", "Justyn", "Aadya"]
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
- 当然,swift也可以自动推测数组和字典的类型,因此,在实际应用中,可以省略类型
let names = ["Lily", "Santiago", "Justyn", "Aadya"]
// an array of String values
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
// a dictionary with String keys and Int values
6、循环
6.1 While 和 Repeat-While 循环
- while循环,先检查条件是否成立,再执行循环体
- repeat循环,先执行循环体,再判断条件是否成立
while !endOfFile {
readLine()
}
repeat {
performTask()
} while tasksRemaining > 0
6.2 For-In循环
6.2.1 遍历字符串
let dogString = "Dog?!🐶"
for character in dogString.characters {
print(character)
}
/*
输出结果:
D
o
g
?
!
🐶
*/
6.2.2 遍历一个闭合区间
使用1...5
表示[1,5]的闭合区间
for number in 1...5 {
print("\(number) times 4 is \(number * 4)")
}
/*
输出结果:
1 times 4 is 4
2 times 4 is 8
3 times 4 is 12
4 times 4 is 16
5 times 4 is 20
*/
6.2.3 遍历半开半闭合区间
- 使用
1..<5
表示[1,5)的半开半闭区间 - 没有这样的写法
1<..5
let results = [7, 52, 9, 33, 6, 12, 86, 4, 22, 18, 3]
let maxResultCount = 5
for index in 0..<maxResultCount {
print("Result \(index) is \(results[index])")
}
/*
输出结果:
Result 0 is 7
Result 1 is 52
Result 2 is 9
Result 3 is 33
Result 4 is 6
*/
6.2.4 遍历数组
- 遍历的临时变量不需要用let声明,默认以let声明,如果需要,可以直接换成var声明,如:
for var name in [...]
- 如果遍历的临时变量不需要被使用到,可以用“
_
”来代替
for name in ["Lily", "Santiago", "Justyn", "Aadya"] {
print("Hello, \(name)!")
}
/*
输出结果:
Hello, Lily!
Hello, Santiago!
Hello, Justyn!
Hello, Aadya!
*/
6.2.5 遍历字典
- 使用元组
(key, value)
来表示字典的键和值 - 元组是可以绑定多个值的一个类型,用括号表示,值之间用逗号分割开来
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
for (name, age) in ages {
print("\(name) is \(age) years old")
}
/*
输出结果:
Mohsen is 17 years old
Amy is 40 years old
Graham is 5 years old
*/
7、可变集合
7.1、可变数组
使用var声明的数组就是可变数组,可以通过几种方式修改可变数组中的值。
- 使用
.append
方法,给数组添加一个元素 - 使用下标
packingList[2]
的方式,修改数组指定位置的元素(小心越界) - 使用
.append(contentsOf:[])
给数组增加一系列的值 - 使用下标
packingList[3...5]
修改数组指定位置范围的值,使用这个方法的时候,如果等号右边的元素数量大于左边的范围,会扩充原数组的长度,反之会减少
var packingList = ["Socks", "Shoes"]
print(packingList[0])
packingList.append("Trousers")
packingList[2] = "Jeans"
packingList.append(contentsOf: ["Shorts", "Sandals", "Sunblock"])
packingList[3...5] = ["Hoodie", "Scarf"]
/*
输出结果:
["Socks", "Shoes", "Jeans", "Hoodie", "Scarf"]
*/
7.2、可变字典
- 可变字典的修改和增加方式都可以用下标来直接操作
var ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
ages["Justyn"] = 67 // Adds a new value for "Justyn"
ages["Justyn"] = 68 // Changes the value for "Justyn"
/*
输出结果:
["Mohsen": 17, "Amy": 40, "Graham": 5, "Justyn": 68]
*/
8、Optional
8.1、从字典中检索值
- 从字典中检索值需要考虑一个问题,就是字典中可能并没有存储我们需要检索的值,比如,在下面的字典中,我们如果去获取Devon、Daryl、Daniel的值,这时候会获得一个空值
nil
- 在获取之后,我们需要判断一下值是否为
nil
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
// Devon?
// Daryl?
// Daniel?
8.2、加上nil判断
- 对于可能返回
nil
的值,我们可以使用swift的Optional特性,在类型后面加一个?
,比如:Int?
,这就表示这个值可能为nil
- 从字典获取指定的值,加上判断之后就变成了下面的代码
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
let possibleAge: Int? = ages["Daryl"]
if possibleAge == nil {
print("Age not found.")
}
/*
输出结果:
Age not found.
*/
8.3、nil值判断优化 If-Let
- 上面的判断看起来没问题,但是在实际应用中,我们可能只关心值不为
nil
的情况,所以,上面的写法会有些臃肿 - swift中提供了
If-Let
语句,只有在值不为nil
的时候才执行条件体
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
if let age = ages["Amy"] {
print("An age of \(age) was found.")
}
/*
输出结果:
An age of 40 was found.
*/
9、 判断结构
9.1、if判断结构
- 和其它语言相似,只是swift中,条件语句不需要小括号括号括起来。
- 每个条件的执行语句需要用大括号括起来
let age = 32
if age == 1 {
print("Happy first birthday!")
} else if age == 40 {
print("Happy 40th birthday!")
} else {
print("Happy plain old boring birthday.")
}
9.2、Switch 判断结构
-
case
可以直接匹配一个精确的值,包括字符串变量也可以直接匹配 -
case
也可以匹配一个范围。如:case 13...19:
-
case
中还可以加入更精确的条件匹配语句。如:case let decade where decade % 10 == 0:
- 每个
case
语句不需要break来结束循环,会自动结束,如果需要执行下一个case
的语句,需要加上fallthrough
关键字 -
switch
中需要匹配完整所有的情况,否则会报错
let age = 32
switch age {
case 1:
print("Happy first birthday!")
case 13...19:
print("Happy birthday, teenager!")
case let decade where decade % 10 == 0:
print("Happy significant \(decade)th birthday!")
default:
print("Happy plain old boring birthday.")
}
- switch可以直接匹配元组,以达到匹配同时判断多个值的目的,如下:
- “
_
” 表示该位置匹配任何值
let userName = "admin"
let passwordIsValid = true
switch (userName, passwordIsValid) {
case ("admin", true):
print("Welcome back, administrator!")
case ("guest", _):
print("Guests are not allowed in this restricted area.")
case (_, let isValid):
print(isValid ? "Welcome to the restricted area!" : "ACCESS DENIED.")
}
/*
输出结果:
Welcome back, administrator!
*/