類似于Objective-C中把block作為屬性進行傳值一樣,swift也可以通過把閉包作為屬性傳值。
它的寫法是這樣的:
swift中的閉包和block在作為回調使用的時候用法稍有不同,因為它并不能直接作為屬性被使用方調用晴玖。為了探究它是怎么用的,我研究了一下SnapKit中的閉包是怎么寫的。現(xiàn)在假設B頁面要把值回調給A頁面眠菇,在B頁面代碼中要創(chuàng)建一個私有的屬性閉包边败,然后寫一個共有的方法用來接收傳進來的閉包并把傳進來的閉包給該私有屬性閉包賦值。然后在A頁面調用B的這個公有方法即可捎废。
為了說明問題我做了一個demo笑窜,點擊A頁面會跳轉到B頁面,然后B頁面上有2個按鈕登疗,點擊這兩個按鈕會跳回到A頁面并觸發(fā)回調排截。
效果圖如下所示:
為了說明問題我是用可視化編程組件來寫UI的。
A頁面代碼如下所示:
//
// ViewController.swift
// swift之屬性閉包回調
//
// Created by Stroman on 2017/8/19.
// Copyright ? 2017年 Stroman. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
//生命周期方法與本demo無關
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.
}
//等待回調
@IBAction func tapAction(_ sender: UITapGestureRecognizer) {
let bViewController:BViewController = self.storyboard?.instantiateViewController(withIdentifier: "BViewController") as! BViewController
bViewController.tranferNoParameterClosure { (Void) in
print("無參回調了")
}
bViewController.tranferParameterClosure { (string) in
print(string)
}
self.present(bViewController, animated: true, completion: nil)
}
}
B頁面的代碼如下所示:
//
// BViewController.swift
// swift之屬性閉包回調
//
// Created by Stroman on 2017/8/19.
// Copyright ? 2017年 Stroman. All rights reserved.
//
import UIKit
class BViewController: UIViewController {
//公有的閉包
private var noParameterEnclosure:((Void) -> Void)?
private var parameterEnclosure:((String) -> Void)?
//用來傳閉包的公有接口辐益。
public func tranferNoParameterClosure(callbackEnclosure:@escaping ((Void) -> Void)) {
self.noParameterEnclosure = callbackEnclosure
}
public func tranferParameterClosure(callbackEnclosure:@escaping ((String) -> Void)) {
self.parameterEnclosure = callbackEnclosure
}
//在dismiss的時候回調
@IBAction func parameterAction(_ sender: UIButton) {
if self.parameterEnclosure != nil {
self.parameterEnclosure!("有參傳值了")
}
self.dismiss(animated: true, completion: nil)
}
@IBAction func noParameterAction(_ sender: UIButton) {
if self.noParameterEnclosure != nil {
self.noParameterEnclosure!()
}
self.dismiss(animated: true, completion: nil)
}
//生命周期方法與本demo無關
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.
}
}