iOS开发Swift

Swift5-四种传值方式

一、单例


  • 1.创建
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()) // 打印内存地址

二、代理


  • 1.定义声明协议
public protocol testDelegate: AnyObject {//必须实现
    func changeString(newString: String)
}
extension testDelegate {//可选实现
    public func printString(newString: String){}
}

class testSwiftView: UIView {
    public weak var delegate: testDelegate?
    func testFun(){
        self.delegate?.changeString(newString: "hahaha")
    }
}
  • 2.遵守协议,实现代理方法
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()
    }
}

自己写的一个代理传值的例子

// 定义一个协议
protocol SearchDelegate: NSObjectProtocol {
    func searchWithParams(params: Dictionary<String, String>)
}
// 父亲Controller实现这个协议
extension ParentViewController: SearchDelegate{
    func searchWithParams(params: Dictionary<String, String>) {
        self.params = params
        xxxxx
    }
}


class ParentViewController: UIViewController {
        let vc = ChildViewController()
        // 指定ChildViewController searchDelegate 为 ParentViewController
        vc.searchDelegate = self
        vc.modalPresentationStyle = .custom
        vc.modalTransitionStyle = .crossDissolve
        self.present(vc, animated: true, completion: nil)
}

class ChildViewController: UIViewController {

    weak var searchDelegate: SearchDelegate?
 
    @IBAction func selectRoomList(_ sender: UIButton) {
        var params: [String: String] = [:]
        // 调用代理的方法,并且把值传给代理的Controller
        searchDelegate?.searchWithParams(params: params)
        self.dismiss(animated: true)
    }
}

三、闭包 (即oc的block)


  • 1.定义闭包
typealias swiftBlock = (_ str: String) -> Void
//写法2: typealias swiftBlock = (_ str: String) -> ()
class testSwiftView: UIView {
    //闭包:函数参数
    func callBackBlock(_ block: @escaping swiftBlock) {
        block(_:"闭包传值1")
    }
    
    //闭包:变量
    var callBack : swiftBlock?
    func useBlock(){
        if callBack != nil {
            callBack!("闭包传值2")
        }
    }
}
  • 2.使用闭包
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let obj = testSwiftView()
        
        //函数
        obj.callBackBlock { (str) in
            print(str)
        }
        
        //参数
        obj.callBack = { (str: String)->Void in
            print(str)
            return
        }
        obj.useBlock()
    }
}

自己写的闭包传值的例子

typealias  TimeFilterBlcok = (_ beginTime: String, _ endTime: String) -> Void

class ChildController: UIViewController {

    
    var callBackBlock: TimeFilterBlcok?

    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    
    @IBAction func confirmButtonAction(){

        callBackBlock!(beginStr!,endStr!)
        self.dismiss(animated: true)
    }
}

class ParentViewController: UIViewController {

    
    override func viewDidLoad() {
        super.viewDidLoad()

    }
    
    
    @IBAction func timeButtonAction(){
        let vc = ChildViewController()
        vc.beginStr = self.beginStr
        vc.endStr = self.endStr
        vc.callBackBlock = {[weak self] (beginTime,endTime) in
            self?.timeSelectButton?.setTitle("\(beginTime) - \(endTime)", for: .normal)
            self?.beginStr = beginTime
            self?.endStr = endTime
        }
        vc.modalPresentationStyle = .custom
        vc.modalTransitionStyle = .crossDissolve
        self.present(vc, animated: true, completion: nil)
    }

}

四、通知


  • 1.添加通知 (用于接收通知,销毁时记得释放添加的通知)
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.发出通知
NotificationCenter.default.post(name: NSNotification.Name("testnotification"), object: self, userInfo:["通知":"通知传值"])