Swift的四种传值方式总结

版权声明: https://blog.csdn.net/qq_35122556/article/details/83543367

Swift 的四种传值方式 有 单例, 代理,闭包(oc的block),通知.

1 单例 Swift 的单例简单到怀疑他的正确性.步骤如下:(下面有具体代码)

 第一步 创建 SingleTest static let shareInstance = SingleTest()
 第二步 使用 SingleTest.shareInstance.getString()
 第三步 验证是否唯一 let str = SingleTest.shareInstance
 print(Unmanaged.passUnretained(str).toOpaque() ) // 打印内存地址

2 代理基本和oc差不多.步骤如下:(下面有具体代码)

第一步 定义协议  

protocol dwDelegate {//第一步 定义协议
    func changeString(newString: String)
}

 第二步  声明协议

var delegate: dwDelegate?  // 第二步  声明协议

第三步 触发协议

self.delegate!.changeString(newString: "hahaha") // 第三步 触发协议

 第四步: 遵守协议

class ViewController: UIViewController, dwDelegate { // 第四步: 遵守协议

 第五步,遵守协议

vc.delegate = self // 第五步,遵守协议

 第六步: 实现协议

func changeString(newString: String) { // 第六步: 实现协议
        print(newString)
    }

3 闭包 具体步骤 如下    :(下面有具体代码)

 第一步  定义闭包

typealias swiftBlock = (_ str: String) -> Void

 第二步   声明

var callBack : swiftBlock? //第二步 声明

 第三步   实现闭包

func callBackBlock(_ block: @escaping swiftBlock) { // 第三步 实现闭包
        callBack = block
    }

 第四步   触发闭包

if callBack != nil {  // 第四步 触发闭包
            callBack!("闭包传值")
        }

第五步   触发闭包回调

cusVC.callBackBlock { (str) in  //第五步 触发闭包回调
            print(str)
        }

4 通知 具体步骤如下

 第一步 第一步 创建通知 (用于接收通知)

let center =  NotificationCenter.default

第二步 添加观察者

center.addObserver(self, selector: #selector(receiveValue(info:)), name: NSNotification.Name(rawValue: "passValue"), object: nil)

  第三步 通知触发的方法

let str = info.object!
        print(str)
        let dic = info.userInfo! as Dictionary
        print(dic["age"]!)

 第四步 创建观察者(用于发送通知)

let center = NotificationCenter.default // 第四步 创建观察者(用于发送通知)

第五步 发出通知

let dic = [
            "name" : "李四" ,
            "sex" : "男",
            "age" : "27"
        ]
        // 第五步 发出通知
        center.post(name: NSNotification.Name(rawValue: "passValue"), object: "传值", userInfo: dic)

1.单例的具体代码:

ViewController :

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white
        let str = SingleTest.shareInstance
        print(Unmanaged.passUnretained(str).toOpaque() ) // 打印内存地址  
        // 单例的使用
        print(SingleTest.shareInstance.getString())
        
        //全局的一些东西.
        // 登陆成功记住用户名
        username = "bdgt"
        print(username)
        
        // 打印枚举
        print(alldata.loginUrl.rawValue)
        
        makeBtn()
        // Do any additional setup after loading the view, typically from a nib.
    }
    func makeBtn() {
        let btn = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 40))
        btn.setTitle("btn", for: UIControlState.normal)
        btn.backgroundColor = UIColor.lightGray
        btn.addTarget(self, action: #selector(btnClick), for: UIControlEvents.touchUpInside)
        self.view.addSubview(btn)
    }
    
    @objc func btnClick(){
    print("ddd")
        let vc = SecondViewController.init()
        present(vc, animated: true, completion: nil)
    }
    
    func changeString(newString: String) { // 第六步: 遵守协议
        print(newString)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

SecondViewController:

import UIKit

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let str = SingleTest.shareInstance
        print(Unmanaged.passUnretained(str).toOpaque() )  // 打印内存地址
        
        
        self.view.backgroundColor = UIColor.lightGray
        makeBtn()
        // Do any additional setup after loading the view.
    }
    
    func makeBtn() {
        let btn = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 40))
        btn.setTitle("返回", for: UIControlState.normal)
        btn.backgroundColor = UIColor.lightGray
        btn.addTarget(self, action: #selector(btnClick), for: UIControlEvents.touchUpInside)
        self.view.addSubview(btn)
    }
    
    @objc func btnClick(){
        print("ddd")
        dismiss(animated: true) {
            print("1")
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

SingleTest:


import UIKit

var username = "" //全局的,可以存储一些必备的.

enum alldata : String{  // 枚举  可以存储 接口
    case loginUrl = "http://www.dansdasda/login"
    case right = "右边"
}

class SingleTest {
    static let shareInstance = SingleTest()
    
    func getString() -> String {
        // 例如  获取当前的时间, 按照一定的格式,在这里写好之后, 所有的地方就都可以调用这里的了.
        return "共有方法,此处获取数据"
    }
}

/*第一种,类常量 Class constant , 建议使用    支持赖加载 线程安全
 class Singleton  {
 static let sharedInstance = Singleton()
 }
 */

/*第二种  嵌套结构体变量格式
 class Singleton {
 class var sharedInstance: Singleton {
 struct Static {
 static let instance: Singleton = Singleton()
 }
 return Static.instance
 }
 }
 */
/* 第三种最不建议,但是最想oc 的创建方式  dispatch_once
 class Singleton {
 class var sharedInstance: Singleton {
 struct Static {
 static var onceToken: dispatch_once_t = 0
 static var instance: Singleton? = nil
 }
 dispatch_once(&Static.onceToken) {
 Static.instance = Singleton()
 }
 return Static.instance!
 }
 }
https://stackoverflow.com/questions/24024549/using-a-dispatch-once-singleton-model-in-swift/24147830#24147830
 */

2 代理的具体代码

ViewController:

import UIKit

class ViewController: UIViewController, dwDelegate { // 第四步: 遵守协议

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white
        makeBtn()
        // Do any additional setup after loading the view, typically from a nib.
    }

    func makeBtn() {
        let btn = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 40))
        btn.setTitle("btn", for: UIControlState.normal)
        btn.backgroundColor = UIColor.lightGray
        btn.addTarget(self, action: #selector(btnClick), for: UIControlEvents.touchUpInside)
        self.view.addSubview(btn)
    }
    
    @objc func btnClick(){
    print("ddd")
        let vc = SecondViewController.init()
        vc.delegate = self // 第五步,遵守协议
        present(vc, animated: true, completion: nil)
    }
    
    func changeString(newString: String) { // 第六步: 实现协议
        print(newString)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

SecondViewController:

import UIKit

protocol dwDelegate {//第一步 定义协议
    func changeString(newString: String)
}

class SecondViewController: UIViewController {

    var delegate: dwDelegate?  // 第二步  声明协议
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.lightGray
        makeBtn()
        // Do any additional setup after loading the view.
    }
    
    func makeBtn() {
        let btn = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 40))
        btn.setTitle("返回", for: UIControlState.normal)
        btn.backgroundColor = UIColor.lightGray
        btn.addTarget(self, action: #selector(btnClick), for: UIControlEvents.touchUpInside)
        self.view.addSubview(btn)
    }
    
    @objc func btnClick(){
        print("ddd")
        dismiss(animated: true) {
            print("1")
            self.delegate!.changeString(newString: "hahaha") // 第三步 触发协议
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

3 闭包的具体代码

ViewController

import UIKit

class ViewController: UIViewController {
    
    var cusVC = CustomPickerView()
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.brown
        //makePickerView()
        makeNewView()
        // Do any additional setup after loading the view, typically from a nib.
    }

    func makeNewView() {
        cusVC = CustomPickerView.init(frame: CGRect(x: 0,y: UIScreen.main.bounds.size.height - 0,width: UIScreen.main.bounds.size.width, height: 260))
        self.view.addSubview(cusVC)
        cusVC.callBackBlock { (str) in  //第五步 触发闭包回调
            print(str)
        }
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        UIView .animate(withDuration: 0.5) {
            self.cusVC.frame = CGRect(x: 0,y: UIScreen.main.bounds.size.height - 260,width: UIScreen.main.bounds.size.width, height: 260)
        };
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

CustomPickerView:

import UIKit
//第一步 定义闭包
typealias swiftBlock = (_ str: String) -> Void

class CustomPickerView: UIView {

    var callBack : swiftBlock? //第二步 声明
    
    override init(frame:CGRect) {
        super.init(frame:frame)
        self.backgroundColor = UIColor.white
        makeTwoBtn()
    }
    
    func callBackBlock(_ block: @escaping swiftBlock) { // 第三步 实现闭包
        callBack = block
    }
    
    @objc func twoBtnClick(btn: UIButton) {
        UIView.animate(withDuration: 0.1, animations: {
            self.frame = CGRect(x: 0,y: UIScreen.main.bounds.size.height - 0,width: UIScreen.main.bounds.size.width, height: 260)
        })
        
        if callBack != nil {  // 第四步 触发闭包
            callBack!("闭包传值")
        }
    }
    
    func makeTwoBtn() {
        let leftBtn = UIButton(frame:CGRect(x: 60,y: 105,width: 50, height:30))
        leftBtn.setTitle("确定", for: UIControlState.normal)
        leftBtn.titleLabel?.font = UIFont.systemFont(ofSize: 15)
        leftBtn.layer.cornerRadius = 2
        leftBtn.layer.masksToBounds = true
        leftBtn.backgroundColor = UIColor.init(red: 255/255.0, green: 100/255.0, blue: 150/255.0, alpha: 1)
        leftBtn.setTitleColor(UIColor.white, for: UIControlState.normal)
        leftBtn.addTarget(self, action: #selector(twoBtnClick), for: UIControlEvents.touchUpInside)
        self.addSubview(leftBtn)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35122556/article/details/83543367
今日推荐