現(xiàn)在隨著Swift的開源局骤,許多開發(fā)者也更加傾向于Swift滤港,隨著Swift的排名不斷上升們也許不久之后就會取代OC的位置廓推,Swift是集眾多語言之長慨飘,也許剛開始接觸覺得語法怪異宵蛀,當年學OC時不也一樣覺得OC語法很糾結(jié)灸促。
下面就來了解一下猴誊,Swift中的閉包(Closure) 影涉,閉包的地位等同于OC中的Block,當然他們之間的用法也很類似!
- 閉包格式
Swift中的閉包表達式靈活,其標準語法格式如下:
{
(參數(shù)列表) ->返回值類型 in
語句組
}
其中茵宪,參數(shù)列表與函數(shù)中的參數(shù)列表形式一樣最冰,返回值類型類似于函數(shù)中的返回值類型,但不同的是后面有in關(guān)鍵字稀火。
下面我們來寫一個簡單的閉包(Closure)暖哨,類比于OC的Block,當時的Block必須要有定義,聲明和實現(xiàn)凰狞,先來簡單回顧一下吧篇裁。 如下:[圖片上傳失敗...(image-509d83-1558575292757)]
一個簡單的OC中的Block寫法:
void (^printBlock)(NSString *x);
printBlock = ^(NSString* str) {
NSLog(@"print:%@", str);
};
printBlock(@"hello world!");
Swift中的閉包(Closure)馬上也來了:
// 聲明一個閉包(有兩個整形參數(shù),且返回值為整形的閉包)
var sumClosure:((a: Int, b: Int) -> Int)
// 實現(xiàn)閉包
sumClosure = { (a: Int, b: Int) -> Int in
return a + b
}
// 調(diào)用
let sum = sumClosure(a: 10,b: 20)print(sum)
是不是類似赡若,這樣學習起來就不會覺得別扭了达布,怪的是語法書寫,原理是相同的逾冬,學習一門語言就是這樣黍聂,原理搞懂了,學起來就輕松了身腻!
- 閉包(Closure)簡化寫法
Swift提供了多種閉包簡化寫法分冈,我來介紹下面幾種不同形式:
// 形式1: 帶有參數(shù)參數(shù)類型,參數(shù)名霸株,返回值類型
sumClosure = { (a: Int, b: Int) -> Int in return a + b}
// 形式2: 省略參數(shù)類型
sumClosure = { (a,b) -> Int in return a + b}
// 形式3: 省略返回值類型
sumClosure = { (a,b) in return a + b}
// 形式4:省略參數(shù)小括號
sumClosure = { a,b in return a + b}
// 形式5: 省略參數(shù)
sumClosure = { return $0 + $1}
// 形式6: 省略關(guān)鍵字
returnsumClosure = { $0 + $1}
- 閉包(Closure)重定義
說到這里,大家是不是想到了 typedef 這個關(guān)鍵字了集乔,但是在Swift中去件,換成 typealias ,當然作用是一樣的扰路。
// 有參數(shù)無返回值的
typealias Myclosure1 = (str:String) ->Void
// 有參數(shù)無返回值的
typealias Myclosure2=(str:String) ->String
// 兩個參數(shù),一個返回值
typealias Myclosure3=(str:String,str:String)->String
// 無參數(shù)尤溜,無返回值
typealias Myclosure4=()->Void
使用如下:
var closure1: Myclosure1?
closure1 = { (str: String) ->Void in
print(str)
}
closure1!(str: "HelloWorld")
- ** 閉包(Closure)作為方法的參數(shù)**
// MARK: - 閉包作為方法參數(shù)
var closure4:Myclosure4?
closure4 = {
print("Swift")
}
func Fun(myclosure: Myclosure4) {
myclosure()
}
Fun(closure4!)
- 閉包(Closure)傳值
這里以兩個界面之間傳值為例,在第一個界面設(shè)置一個UILable,將第二個界面UITextField中的值傳到UILable上汗唱,原理和使用Block進行界面?zhèn)髦凳且粯拥模?br>
使用storyBoard直接拖得宫莱,方便快捷。
下面是示例代碼:
第一個界面 :ViewController.swift
import UIKitclass ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated.
}
func setupClosures(str: String) -> Void {
label.text = str
}
@IBAction func next(sender: UIButton) {
let AVC: AViewController = UIStoryboard.init(name:"Main", bundle:nil).instantiateViewControllerWithIdentifier("AVC") as! AViewController
// AVC.myclosures = setupClosures
AVC.myclosures = {[unowned self] (str: String) ->Void in
self.label.text = str
}
self.navigationController?.pushViewController(AVC, animated: true)
}
}
第二個界面 :AViewController.swift
import UIKitclass AViewController: UIViewController {
typealias closures = (text: String) -> Void
@IBOutlet weak var textField: UITextField!
var myclosures: closures?
override func viewDidLoad() {
super.viewDidLoad() // Do any additional setup after loading the view. }
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated.
}
@IBAction func previous(sender: UIButton) {
if (myclosures != nil) {
myclosures?(text:textField.text!)
}
self.navigationController?.popViewControllerAnimated(true)
}
}
先到這里吧哩罪,大家相互學習授霸,不足還望指出!