函数:
没有参数没有返回值
func say() -> Void {
    print("hello")
}
say()
func say1() -> () {
    print("hello")
}
say1()
// 推荐
func say2() {
    print("hello")
}
say2()
有参数没有返回值
内部/外部参数
// Swift2.0之前, 默认是不会将第二个参数开始的参数名称作为外部参数的, 必须自己手动指定
func sum(i: Int, j: Int) {
    print(i + j)
}
sum(10, j: 20)
func sum1(first i: Int, second j: Int) {
    print(i + j)
}
sum1(first: 10, second: 20)
默认参数(Default Parameter Values)
注意
func sum2(i: Int, j: Int = 10) {
    print(i + j)
}
//sum2(10, j: 20)
sum2(10)
// 不推荐这样写, 最好将默认参数写在最后
func sum3(i: Int = 20, j: Int) {
    print(i + j)
}
常量参数和变量参数(Constant and Variable Parameters)
注意
func sum4(let i: Int, let j: Int) {
    print(i + j)
}
sum4(10, j: 20)
var num1 = 10
var num2 = 20
//func swap(value1: Int, value2: Int){
//    let temp = value1
//    value1 = value2
//    value2 = temp
//}
// 注意: 操作的是局部变量, 对实参没有影响
func swap1(var value1: Int, var value2: Int){
    print("交互前: value1 = \(value1), value2 = \(value2)")
    let temp = value1
    value1 = value2
    value2 = temp
    print("交互后: value1 = \(value1), value2 = \(value2)")
}
swap1(num1, value2: num2)
print(num1)
print(num2)
输入输出参数(In-Out Parameters)
注意
func swap2(inout value1: Int, inout value2: Int){
    print("交互前: value1 = \(value1), value2 = \(value2)")
    let temp = value1
    value1 = value2
    value2 = temp
    print("交互后: value1 = \(value1), value2 = \(value2)")
}
swap2(&num1, value2: &num2)
print(num1)
print(num2)
可变参数(Variadic Parameters)
注意
func sum5(numbers: Int...) {
//    print(numbers)
    var sum = 0
    for number in numbers {
        sum += number
    }
    print(sum)
}
sum5(1, 2, 3)
// 不推荐写法, 和默认值一样, 变参最好写在最后
func sum6(numbers: Int..., var sum: Int) {
    //    print(numbers)
    for number in numbers {
        sum += number
    }
    print(sum)
}
sum6(1, 2, 3, sum: 0)
// 推荐写法
func sum7(var sum: Int = 100, numbers: Int...) {
    //    print(numbers)
    for number in numbers {
        sum += number
    }
    print(sum)
}
sum7(numbers: 1, 2, 3)
// 一个函数中只能有一个变参
//func sum8(numbers: Int..., values: Int...){
//    print(numbers)
//    print(values)
//}
// 有参数有返回值
func sum8(i: Int, j: Int) -> Int {
    return i + j
}
let result = sum8(10, j: 20)
print(result)
闭包
 {
     (形参列表) -> 返回值类型
     in
     执行语句
 }
        // 正常写法
        loadData ({ () -> () in
            print("执行了")
        })
        */
        /*
        // 闭包的其它写法
        // 1.如果闭包是函数的最后一个参数, 那么可以把闭包写在调用函数的()后面
        // 这种写法, 我们称之为 "尾随闭包"
        loadData("123") {
            () -> ()
            in
            print("执行了")
        }
        // 2.如果函数只接收一个参数, 并且这个参数是闭包, 那么调用函数的()可以省略
        // 这种写法, 我们称之为 "尾随闭包"
        loadData {
            () -> ()
            in
            print("执行了")
        }
func loadData(since_id: String, finished: ()->()) -> Void {
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            print("子线程做耗时操作 \(NSThread.currentThread())")
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                print("主线程更新UI \(NSThread.currentThread())")
                finished()
            })
        }
    }
    /*
    func loadData(finished: ()->()) -> Void {
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            print("子线程做耗时操作 \(NSThread.currentThread())")
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                print("主线程更新UI \(NSThread.currentThread())")
                finished()
            })
        }
    }
block
OC中如何解决循环引用
Swift中如何解决循环引用
所以被weak修饰的变量是可选类型
unowned var weakSelf = self
所以被unowned修饰的变量, 不是可选类型
注意: weak和unowned只能修饰对象类型, 因为只有对象类型才有引用计数
应用场景:
捕获列表
调用闭包时在形参列表前面通过[]指定捕获列表, 告诉系统如何处理指定的这些值        //weak var weakSelf = self
        //unowned var weakSelf = self
        callBack = { [unowned self ,weak btn = self.button] () -> () in
            //self.view.backgroundColor = UIColor.redColor()
            //weakSelf.view.backgroundColor = UIColor.redColor()
            self.view.backgroundColor = UIColor.redColor()
            print(btn)
        }
        loadData(callBack!)
    }
    func loadData(finished: ()->()) -> Void {
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            print("子线程做耗时操作 \(NSThread.currentThread())")
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                print("主线程更新UI \(NSThread.currentThread())")
                finished()
            })
        }
    }
例如,如果创建了一个自定义的类来打开一个文件,并写入一些数据,你可能需要在类实例被释放之前手动去关闭该文件
    deinit {
        print("88")
    }
原文:http://www.cnblogs.com/l110/p/5143856.html