美文网首页
swift之闭包、协议、通知、单例、KVO简单使用

swift之闭包、协议、通知、单例、KVO简单使用

作者: 熟睡的毛毛虫 | 来源:发表于2018-09-19 20:23 被阅读6次

    前言:

         Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于Mac OSiOS平台,用于搭建基于苹果平台的应用程序。
         Swift是一款易学易用的编程语言,而且它还是第一套具有与脚本语言同样的表现力和趣味性的系统编程语言。Swift的设计以安全为出发点,以避免各种常见的编程错误类别。

    这里简单的介绍一下常用的几种通讯模式

    正文

    一、闭包

    场景描述:控制器A 传值到 控制器B
    1.闭包的定义:(控制器A里面)

        //第一种方式
        typealias blockClosure = (Any)->Void
        var didClickItemBlock: blockClosure?
        //第二种方式
        var didClickItemBlock: ((Any)->Void)?
    

    2.触发:(控制器A里面)

        if didClickItemBlock != nil{
           didClickItemBlock!(obj/*内容*/)
        }
    

    3.回调处理:(控制器B里面)

         A.didClickItemBlock = {(obj)in
            print(obj)
         }
    
    二、协议

    场景描述:控制器A 传值到 控制器B
    1.协议的定义:(控制器A里面)

        @objc protocol SelectDelegate{
            /*默认是必须实现的*/
            optional func selectOne()->Void 
           /*optional修饰是可选实现的*/
            @objc optional func selectTwo()->Void
        }
    

    2.触发协议里面的方法:(控制器A里面)

    //可选需要加个判断,不然代理方法没实现就会crash
    //delegate?.selectOne?()  若代理不存在返回nil,若方法没实现返回nil
    //括号里面加入要传的内容
        if (delegate?.selectOne?()) != nil {
            delegate?.selectOne!()
        }
    

    3.设置协议的代理为自己:(控制器B里面)

    //遵循协议 SelectDelegate
        class B: UIViewController , UITableViewDelegate , UITableViewDataSource, SelectDelegate{
        
        }
    
        A.delegate = self
    

    4.代理方法的实现:(控制器B里面)

    //括号里面为接收的内容
        func selectOne() {
            print("jiligulu")
        }
    
    三、单例

    1.定义:可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问从而方便地控制了实例个数,并节约系统资源。

    2.代码:(创建一个ShareInstance类,里面代码如下)

    import UIKit
    
        class ShareInstance: NSObject {
    
            static let instance = ShareInstance()
        
        }
    

    3.使用

       let a = ShareInstance.instance
    
    四、通知

    1.场景:当控制器A发一个通知,B需要做出相应的变化
    2.代码:

    //B里面添加观察者
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
            NotificationCenter.default.addObserver(self, selector: #selector(receiveMessage(noti:)), name: NSNotification.Name("receiveMessage"), object: nil)
        }
    
    //B里面添加方法,当收到通知后,会执行的方法
        @objc func receiveMessage(noti :Notification) -> Void {
            
            print(noti.userInfo!)
            
        }
    
    //相当于OC的dealoc,在这里移除观察者
        deinit {
            NotificationCenter.default.removeObserver(self)
        }
    
    //A里面发送通知
         NotificationCenter.default.post(name: Notification.Name("receiveMessage"), object: nil, userInfo: ["我很傻": false])
    
    五、KVO

    场景:实时监控button的内容变化
    代码:

        let button = UIButton(type: UIButtonType.custom)       
        button.addObserver(self, forKeyPath: "titleLabel.text", options: .new, context: nil)
    
        override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
            //这个地方需要根据实际情况做出做判断的
            print((change?.values)!)
            
        }
    

    结束语

    说一下我关于swift的学习心得,之前有尝试看视频,看官方英文文档,还有中文文档,期间不是瞌睡就是觉得无趣中断了。最近又有时间,想感受下swift到底是个什么鬼,就找了当前项目的一个界面,开始搭建,碰到不懂得就查,很有感觉,觉得swift不错。联想到之前关于读书的说法,不要一页一页的看,随意翻一下,感兴趣就读,不明白了再翻,这样不仅不会觉得无趣,更加会印象深刻,触发自己的主观能动性,避免了自己的激情在无趣中消磨殆尽。
    Be grateful for people who can speak up about your weaknesses, and they will make you stronger and stronger.

    相关文章

      网友评论

          本文标题:swift之闭包、协议、通知、单例、KVO简单使用

          本文链接:https://www.haomeiwen.com/subject/hpqwnftx.html