08Swift基本语法(闭包)

2016-08-03  本文已影响8人  i爱吃土豆的猫

0. 闭包

1 闭包的定义

1.1 定义一个函数
//: 定义一个 sum 函数    
func sum(num1 num1: Int, num2: Int) -> Int { 
    return num1 + num2
}

sum(num1: 10, num2: 30)

//: 在 Swift 中函数本身就可以当作参数被定义和传递
let mySum = sum
let result = mySum(num1: 20, num2: 30)
1.2定义一个闭包
//: 闭包 = { (行参) -> 返回值 in // 代码实现 }
let sumFunc = { (num1 x: Int, num2 y: Int) -> Int in 
    return x + y
}
sumFunc(num1: 10, num2: 20)
1.3 最简单的闭包,如果没有参数/返回值,则 参数/返回值/in
let demoFunc = { 
    print("hello")
}

2. 闭包基本使用

2.1 GCD 异步(模拟在后台线程加载数据)
func loadData() { 
    dispatch_async(dispatch_get_global_queue(0, 0), { () -> Void in 
        print("耗时操作 \(NSThread .currentThread())") 
    })
}
func loadData() { 
      dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in 
         print("耗时操作 \(NSThread .currentThread())") 
    }
}
func loadData() { 
    dispatch_async(dispatch_get_global_queue(0, 0)) { 
        print("耗时操作 \(NSThread .currentThread())") 
    }
}
2.2 自定义闭包参数,实现主线程回调

1.添加没有参数,没有返回值的闭包

override func viewDidLoad() { 
    super.viewDidLoad() 

    loadData { 
        print("完成回调") 
    }
}

// MARK: - 自定义闭包参数
func loadData(finished: ()->()) { 
    
        dispatch_async(dispatch_get_global_queue(0, 0)) { 
              print("耗时操作 \(NSThread.currentThread())") 

              dispatch_sync(dispatch_get_main_queue()) { 
                     print("主线程回调 \(NSThread.currentThread())") 

                     // 执行回调 
                     finished() 
                   } 
            }
 }

2.添加回调参数

override func viewDidLoad() { 
    super.viewDidLoad() 

    loadData4 { (html) -> () in 
        print(html) 
    }
}

/// 加载数据
/// 完成回调 - 传入回调闭包,接收异步执行的结果
func loadData4(finished: (html: String) -> ()) { 

    dispatch_async(dispatch_get_global_queue(0, 0)) { 
         print("加载数据 \(NSThread.currentThread())") 

    dispatch_sync(dispatch_get_main_queue()) { 
        print("完成回调 \(NSThread.currentThread())") 

        finished(html: "<h1>hello world</h1>") 
        } 
    }
}

3. 闭包的循环引用

4. 解除循环引用

1.OC 类似的方法
/// 类似于 OC 的解除引用
func demo() { 
    weak var weakSelf = self 
    tools?.loadData() { 
        print("\(weakSelf?.view)") 
    }
}
2. Swift 推荐的方法
loadData { [weak self] in 
    print("\(self?.view)")
}

或者

loadData { [unowned self] in 
    print("\(self.view)")
}

5. 闭包(Block) 的循环引用小结

  1. Objc
    1.__weak typeof(self) weakSelf;
    如果self已经被释放,则为nil

    2.__unsafe_unretained typeof(self) weakSelf;
    如果self已经被释放,则出现野指针访问
    
  2. Swift
    1.[weak self]
    self是可选项,如果self已经被释放,则为nil

    2.[unowned self]
    self不是可选项,如果self已经被释放,则出现野指针访问
    

文/greedyDoor(简书作者)原文链接:http://www.jianshu.com/p/bbb9d6c636f4著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

上一篇 下一篇

猜你喜欢

热点阅读