你好,歡迎來到IOS教程網

 Ios教程網 >> IOS使用技巧 >> IOS7技巧 >> ios開發之Swift閉包使用示例

ios開發之Swift閉包使用示例

編輯:IOS7技巧
閉包這個東西我們在許多程序開發中都會有用到閉包了,下面來看Swift閉包使用示例,希望下面這篇文章能夠讓各位了解到Swift閉包用法。

什麼是閉包?

閉包是指可以包含自由(未綁定到特定對象)變量的代碼塊;這些變量不是在這個代碼塊內或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義(局部變量)。
“閉包” 一詞來源於以下兩者的結合:要執行的代碼塊(由於自由變量被包含在代碼塊中,這些自由變量以及它們引用的對象沒有被釋放)和為自由變量提供綁定的計算環境(作用域)。
在Swift中,Swift的閉包跟OC中的Block很像,OC中的Block類似於匿名函數,閉包用來定義函數。
無論是OC中的Block還是Swift中的閉包,其實都是用來保存一段代碼,在需要的時候執行
如何定義一個閉包:

Swift

 代碼如下 復制代碼

//創建一個傳遞2個參數的閉包,並且返回值為Int類型
var add = { (a:Int,b:Int)-> Int in
    return a + b
}

//還可以這樣寫
var add = ({ (a:Int,b:Int)-> Int in
    return a + b
})

//還可以這樣寫
var add = (){ (a:Int,b:Int)-> Int in
    return a + b
}

在Swift中能不寫self就不寫self,但是在閉包中,必須要寫self

閉包的簡寫:如果閉包沒有參數和返回值,那麼可以刪除in之前的東西(包括in)

 代碼如下 復制代碼

var closure = { () -> Void in
    print("這個是閉包")
}
//可以簡寫為
var closure = {
    print("這個是閉包")
}
可以吧閉包當做實參傳遞給函數
Swift
func first(second: (a:Int,b:Int)->(Int)) {
    print("這個是第一個方法")
    let num = second(a: 10,b: 5)
    print("\(num)")
}

first { (a, b) in
    print("第二個方法")
    return a + b
}
/* 輸出結果:
這個是第一個方法
第二個方法
15
*/

如果函數只接收一個參數,那麼閉包可以直接寫在()的後面

 代碼如下 復制代碼

func add(num:Int , sub:(a:Int,b:Int) -> Int){
    print("執行了add func")
    let num2 = sub(a: 10,b: 5)
    let result = num + num2
    print("num + num2 = \(result)")
}

add(10) { (a, b) -> Int in
    return a - b
}
/* 輸出結果:
執行了add func
num + num2 = 15
*/

閉包循環引用的問題

只要涉及到循環引用的,都有資源釋放的這個問題。
在Swift中沒有dealloc函數,但是有deinit這個析構函數。

 代碼如下 復制代碼

import UIKit
//使用屬性來保存閉包,self.finished 保存著閉包,然後在閉包裡面使用self,所以出現了循環引用
var finished:(() -> ())?

class ViewController: UIViewController {

     override func viewDidLoad() {
        super.viewDidLoad()
            add {
                print("這個在主進程")
                self.view.backgroundColor = UIColor.greenColor()
            }
   }

   func add(sub:() -> ()){
    print("執行了add func")
    }

    deinit {
        print("這裡進行銷毀")
    }

}

 

怎麼解決呢?

把self變成弱引用即可。

 代碼如下 復制代碼

import UIKit
//使用屬性來保存閉包,self.finished 保存著閉包,然後在閉包裡面使用self,所以出現了循環引用
var finished:(() -> ())?

class ViewController: UIViewController {

     override func viewDidLoad() {
            //把self變成弱引用即可
            weak var weakSelf = self
        super.viewDidLoad()
            add {
                print("這個在主進程")
                weakSelf!.view.backgroundColor = UIColor.greenColor()
            }
   }

   func add(sub:() -> ()){
    print("執行了add func")
    }

}

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved