不同类型的变量
Swift 中有很多数据类型如:
1 | var count: Int |
其他数据类型如:
- Double
- Character
- UInt(unsigned Int)
- Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64.
- CGFloat(CG stands for the Core Graphics framework)
要点:
- Swift 无法进行数据类型的自动转换。
- 变量赋初值时 Swift 可以进行数据类型推断。
对象赋值格式可简写如下:
1
2var item: ChecklistItem()
var newitem: ChecklistItem(text: "Charge my iPhone", checked: false) // 传递参数到init方法在类方法中使用
self
避免实例被隐藏1
2
3
4
5
6
7class MyObject {
var count = 7
func myMethod() {
var count = 42
println(self.count) //打印结果为7
}
}
定义常量
可以把所有变量定义为常量,如果程序运行过程中 IDE 警告常量值发生改变,可再将常量声明为变量。
1 | let pi = 3.141592 |
数组和字典
必须声明所存储的数据的类型。
数组
1
2
3
4
5
6
7
8// 包含对象的数组
var items: Array<Classname>
// 使用短语法
var items: [Classname]
// 创建数组实例
items = [Classname]()
// 访问数组中对象
let item = items[3]字典
1
2
3
4
5
6
7
8// 存储(String, Int) 键值对的字典
var ages: Dictionary<String, Int>
// 短语法
var ages: [String: Int]
// 创建字典实例
ages = [String: Int]()
// 访问字典中的对象
var age = dict["Jony Ive"]
可选值类型
如果一个变量可以没有值,应该把它声明为可选值(optional)类型。
1 | var checklistToEdit: Checklist? |
如果不确定值是否为空,可使用可选链防止 crash :
1 | navigationController?.delegate = self |
使用这个类型的变量之前,要测试它是否为空,这一过程称为拆包(unwrapping)。
1 | if let checklist = checklistToEdit { |
从字典中取值时,并不知道字典中是否包含该键值,要使用如下代码拆包:
1 | if let age = dict["Jony Ive"] { |
如果确定字典中含有该键值,可强制拆包:
1 | var age = dict["Jony Ive"]! |
同时,可以把变量用!
声明为绝对拆包可选值(Implicitly unwrapped optional)。
使用此变量不用拆包,但如果值为空,会引发 APP 崩溃。所以一般在无法在声明变量时赋初值的情况才使用。
1 | var dataModel: DataModel! |
数值类型和引用类型
实例化的对象是引用类型:
1 | var firstLabel = UILabel() |
其他都是数值类型:
1 | var a = [1, 2, 3] |
方法
调用一个对象的方法,就像从一个对象向另一个对象传递消息:
1 | lists.append(checklist) |
调用同个类中的方法时,可使用关键字self
:
1 | class DataModel { |
选择语句
关键字if
和switch
的一般用法同 C 语言:
1 | func performDifficultCalculation(list: [Double]) { |
循环语句
for
和while
的一般用法同 C 语言:
1 | for var i = start; i < end; ++i { |
在数组和字典中可以使用 for-in 语句:
1 | for item in items { |
1 | for i in stride(from: 0, to: 5, by: 2) { |
对象
创建 MyObject.swift 文件,写入新类以创建对象:
1 | class MyObject { |
实例化一个对象:
1 | var myInstance = MyObject() // 创建一个实例 |
工厂方法创建实例:
1 | class MyObject { |
定义初始化方法,初始化时必须给实例赋初值。
一个对象可以有多个初始化方法:
1 | class MyObject { |
继承
1 | class ChecklistViewController: UITableViewController |
实际上的继承树是
ChecklistViewController -> UITableViewController -> UIViewController -> UIResponder -> NSObject
覆写
要修改继承的方法、属性等的实现,必须使用override
:
1 | class MyViewController: UIViewController { |
协议
协议就是方法名的列表:
1 | protocol MyProtocol { |
如果对象表明要遵从某个协议,必须去实现协议中的方法,它是哪种对象并不重要:
1 | class MyObject: MyProtocol { |