Swift 的四種傳值方式: 1.單例 2.代理 3.閉包(oc的block) 4.通知
一室叉、單例
1.創(chuàng)建
class testSwiftView: NSObject {
static let shareInstance = testSwiftView()
func getString(){
print("single")
}
}
2.使用
testSwiftView.shareInstance.getString()
3.驗證是否唯一
let obj = testSwiftView.shareInstance
print(Unmanaged.passUnretained(obj).toOpaque()) // 打印內(nèi)存地址
二趋箩、代理
1.定義聲明協(xié)議
public protocol testDelegate: AnyObject {//必須實現(xiàn)
func changeString(newString: String)
}
extension testDelegate {//可選實現(xiàn)
public func printString(newString: String){}
}
class testSwiftView: UIView {
public weak var delegate: testDelegate?
func testFun(){
self.delegate?.changeString(newString: "hahaha")
}
}
- 遵守協(xié)議泣懊,實現(xiàn)代理方法
class ViewController: UIViewController, testDelegate {
func changeString(newString: String) {
print(newString)
}
func printString(newString: String) {
print(newString)
}
override func viewDidLoad() {
let obj = testSwiftView()
obj.delegate = self
obj.testFun()
}
}
三、閉包 (即oc的block)
- 定義閉包
typealias swiftBlock = (_ str: String) -> Void
//寫法2: typealias swiftBlock = (_ str: String) -> ()
class testSwiftView: UIView {
//閉包:函數(shù)參數(shù)
func callBackBlock(_ block: @escaping swiftBlock) {
block(_:"閉包傳值1")
}
//閉包:變量
var callBack : swiftBlock?
func useBlock(){
if callBack != nil {
callBack!("閉包傳值2")
}
}
}
- 使用閉包
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let obj = testSwiftView()
//函數(shù)
obj.callBackBlock { (str) in
print(str)
}
//參數(shù)
obj.callBack = { (str: String)->Void in
print(str)
return
}
obj.useBlock()
}
}
四、通知
- 添加通知 (用于接收通知,銷毀時記得釋放添加的通知)
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//添加通知
NotificationCenter.default.addObserver(self, selector:#selector(test1(notification:)), name: NSNotification.Name("testnotification"), object: nil)
}
//接收通知處理方法
@objc func test1(notification:NSNotification) -> Void {
let userinfo = notification.userInfo as![String:AnyObject]
print("這是個通知:",userinfo["通知"] as!String)
}
//釋放移除通知
deinit {
NotificationCenter.default.removeObserver(self)
}
}
2.發(fā)出通知
NotificationCenter.default.post(name: NSNotification.Name("testnotification"), object: self, userInfo:["通知":"通知傳值"])