繁体   English   中英

Swift委托作为函数参数

[英]Swift delegate as a function parameter

我创建了如下协议:

import Foundation
protocol ITcpCLient: class {
    func OnMessageReceived(_ message: String);
}

使用协议的类如下:

import Foundation

class tcpConnection {
    var tcpClientdelegate: ITcpCLient?

    init(client: ITcpCLient) {
        self.tcpClientdelegate? = client

        if self.tcpClientdelegate == nil {
            print("tcpClient Delegate is nil!")
        }
    }

    func trigger() {
        tcpClientdelegate?.OnMessageReceived("From Trigger")
    }

}

我的ViewController类如下:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        print("viewDidLoad!")
        let myTcpConnection = tcpConnection(client: self)
        myTcpConnection.trigger()
    }


}


extension ViewController: ITcpCLient {

    func OnMessageReceived(_ message: String) {
        print("onMessageReceived")
        print(message)
    }

}

输出为:tcpClient代表为零! 如果我创建没有问号的委托,代码将按预期工作。但是当我使用可选类型时,我无法将viewcontroller类分配为委托。

由于self.tcpClientdelegatenil因此追加? 运算符将导致整个语句无法运行=>这将导致该委托被取消声明= nil

self.tcpClientdelegate? = client

所以换成

self.tcpClientdelegate = client

问题出在init

self.tcpClientdelegate? = client

后缀? 如果操作数为nil则该操作符将不执行您指定的任何操作。

在这里, self.tcpClientdelegate为零,因此未分配该值。

Swift语言参考中

可选链接表达式必须出现在后缀表达式中,并且它们使后缀表达式以特殊方式求值。 如果可选链表达式的值为nil,则后缀表达式中的所有其他操作将被忽略 ,整个后缀表达式的求值为nil。

只需正常分配它即可解决问题,因为您不必关心self.tcpClientdelegate是否为nil

self.tcpClientdelegate = client

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM