美文网首页swiftSwiftiOS 传值
Swift5-swift的四种传值方式

Swift5-swift的四种传值方式

作者: Jesscia_Liu | 来源:发表于2020-05-18 17:12 被阅读0次

Swift 的四种传值方式: 1.单例 2.代理 3.闭包(oc的block) 4.通知

一、单例

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")
    }
}
  1. 遵守协议,实现代理方法
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)

  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")
        }
    }
}
  1. 使用闭包
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()
    }
}

四、通知

  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:["通知":"通知传值"])

相关文章

  • Swift5-swift的四种传值方式

    Swift 的四种传值方式: 1.单例 2.代理 3.闭包(oc的block) 4.通知 一、单例 1.创建 2....

  • 【原】swift基础篇之页面传值

    这里讲的传值方式主要有四种:页面属性传值、NSUserDefaults、协议传值、闭包block传值。均以两个控制...

  • iOS,Block传值

    iOS页面之间传值,通常采取四种方式:属性、通知、代理和Block回调传值这四种方式。 今天在这里,我们详细讲解B...

  • Intent四种数据传递方式

    Intent四种数据传递方式 MainActivity中传值操作 class MainActivity exten...

  • Block传值

    iOS传值一共有四种:属性传值,代理传值,通知传值以及Block传值; 今天我们来说一下Block传值: 概念:带...

  • Learning iOS D7 2017-10-30(传值方式

    Swift 4 四种传值方式 一:闭包传值(子vc传给父vc) 1.声明一个闭包(子vc) var closure...

  • 一、jsp

    1、页面之间的传值方式有四种: url后面直接跟值 form表单 cookie session 2、jsp中的ja...

  • OC中反向传值的方法

    oc中反向传值四种方法 block反向传值 在需要传值的界面: 在接受到传值的界面 单例反向传值 创建一个单例类 ...

  • vue通信、传值的多种方式

    组件之间传值方式 页面间之间传值方式

  • iOS之传值

    在iOS中传值的方式有很多种方式,有最普遍的就是属性传值,代理传值,block传值等方式了。写了OC和swift的...

网友评论

    本文标题:Swift5-swift的四种传值方式

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