1. 函数与闭包, 利用func来声明一个函数, 通过 -> 指定函数返回值的类型. 定义含有参数的函数必须指定参数的类型. 默认情况下, 函数使用它们的形式参数作为实际参数的标签, 在形参前面可以定义实际参数标签, 或者使用_避免使用实际参数标签. 函数可以通过元组的方式返回多个值. 元组可以通过下划线方式访问value.0, 也可以通过标签的形式访问: value.double1
func someFunction(firstValue: Int, secondValue: String) -> Int {
} //调用: someFunction(firstValue: 3, secondValue: "123")
func secondFunction(_ firstValue: Int, secondValue: String) -> Int {
} //调用: secondFunction(3, secondValue: "123")
func thirdFunction() -> (double1: Int, double2: Int) {
} //调用 let value = thirdFunction().
2. 定义一个参数可变的函数, 使用...表示参数个数可变, 在函数主体内部, 可变参数变成一个数组. 一个函数可以有任意个非可变参数, 但只有列表最后一个参数可以是可变参数
func testFunction(numbers: Int...) -> {
var total = 0; for num in numbers { total += num}; return total;
} 调用: let a = testFunction(numbers: 1, 2, 3, 4)
3. 通常函数以参数为输入时是值传递, 使用inout关键字可以引用传递改参数, 直接改变这个变量中的存储值.
func swapValues (firstValue: inout Int, secondValue: inout Int) {
let tmp = firstValue; firstValue = secondValue; secondValue = tmp;
} //调用: var swap1 = 123; var swap2 = 456; swap(&swap1, &swap2);
4. 函数可以用作变量, 可以声明一个变量, 能够存储特定参数和返回值类型, 只要一个函数的
参数和返回值类型都与变量一直, 即可将函数存储到这个变量中. 这个变量可以作为其他函数的参数, 也可以作为其他函数的返回值.
func createIncrementor(inCrementAmount: Int) -> () -> Int {
var amout = 0
func incrementor() -> Int {
amount += inCrementAmount; return amount;
}
return incrementor;
}
5. 闭包, 闭包其实就是一些小的匿名代码块, 可以像函数一样使用. 可以使用{}括起一个没有名字的闭包, 闭包使用in来分隔实际参数和返回类型. 如果闭包只包含一行代码可以省略return, 如果闭包是函数的唯一参数, 可以去掉圆括号直接写闭包
let numbers = [5, 1, 4, 3]
let array = numbers.sorted(by: {(n1, n2) -> Bool in
return n2 > n1
})
let array2 = numbers.sorted(by:{
$1 > $0
})
6. 闭包可以和函数一样存储在变量中, 存储以后可以像调用函数一样调用他们.
var comparator = {(a: Int, b: Int) -> Bool in return a < b}
comparator(1, 2); //true
7. 对象和类, Swift中通过class后接类名称创建一个类. 类中可以包含属性和方法, 属性和方法是类的组成部分, 属性是变量, 方法是函数. self是引用当前运行该代码的对象, 使用init(初始化器)可以创建初始化信息. 使用deinit(反初始化器)可以在释放对象之前做一些清理工作.
class Vehicle {
var color: String?; var maxSpeed = 80
init(color: String){ self.color = color; }
func descrption() -> String { return "A \(self.color) vehicle" }
}
定义实例: var redVehicle = Vehicle();
redVehicle.color = "Red"; redVehicle.descrption ()
8. 继承, 一个类可以继承另外一个类, 当一个类继承另外一个类的时候, 他会包含这个父类的的函数和属性, 在Swift中一个类只能有一个父类, 继承可以重写函数, 重写函数前面必须加override关键字, 否则编译器会报错. 如果在重写的函数中调用父类的版本, 可以使用super关键字.
Class Car : Vehicle {
override func description -> String {
var description = super.description();
retrun description + "is a car"
}
}
9. 初始化和反初始化, 在Swift中创建对象时, 会调用一个被称为初始化器的特殊方法, 初始化器用来为对象设定初始状态的方法. 除了初始化器还有一个反初始化器, 对象从内存中清除时调用. 就是在对象消失之前做一些清理工作.
class InitAndDeinitExample {
init() { println("I have been created!") } //主初始化器
convenience init(text: String) { //便携式初始化器
self.init(); //调用上述主初始化器必须的
println("I was called with the convenience initializer!")
}
deinit { //反初始化器
println("I have going away!")
}
}
10. 初始化器可以返回nil, 当初始化器不能成功构造一个函数时, 会返回nil, 例如: NSURL, 当接受一个无效的字符串时, 返回nil. 要创建一个可以返回nil的初始化器, 就在init后面放上一个问号, 并在初始化器不能成功构造对象时, 返回nil. 一个可以失败的初始化器, 任何可以在其中存储结构的变量都是可选的.
convenience init?(value: Int) {
self.init(); if value > 5 { return nil; //表示初始化失败 }
}
11. 属性, 属性就是变量或常量, 附着到类的实例中, 类将数据存储到实例中. 属性分为存储属性和计算属性. 存储属性: 属性是存储在对象中一个简单的值. 计算属性: 利用代码计算他们的取值. 计算属性的定义, 可以像声明储存属性一样声明一个变量, 然后在后面增加大括号, 在大括号内提供get部分, 还可视需要提供一个set部分.
classRectangle {
var width: Double = 0.0; var height: Double = 0.0;
var area: Double {
get { return width * height }
set { width = sqrt(newValue); height = sqrt(newValue); }
}
}
12. 属性观察器, 在属性发生变化时可以运行某些代码. 可以像属性添加属性观察器. 创建属性观察器方式: 需要在属性后面添加大括号, 并包含willSet(属性发生变化之前被调用)和didSet(属性发生变化之后被调用)代码块.
class PropertyObserverExample {
var number: Int = 0 {
wilSet(newNumber) { println("will change to \(newNumber)") }
didSet(newNumber) { println("did change to \(newNumber)") }
}
}
13. 可以将属性设成惰性的, 惰性属性就是首次访问才会设定的属性. 类的某些设置工作需要耗费大量的时间, 利用惰性属性可以将工作推迟到需要的时完成, 将一个属性设置成惰性属性, 只需要在其前面加上lazy关键字.
class SomeClass1 {
init(id: Int) { println("SomeClass1 created: \(id)") }
}
class SomeClass2 {
var varClass1 = SomeClass1(id: 1)
lazy var varClass2 = SomeClass1(id: 2)
init() { println("first created!") }
}
var varClass2 = SomeClass2(); //输出: SomeClass1 created: 1 first created!
varClass2.varClass1 //不输出任何内容, 因为已经创建
varClass2.varClass2 //输出: SomeClass1 created: 2