Swift委托作为函数参数

时间:2018-11-01 13:44:17

标签: ios swift null delegates

我创建了如下协议:

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类分配为委托。

2 个答案:

答案 0 :(得分:2)

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

self.tcpClientdelegate? = client

所以替换为

self.tcpClientdelegate = client

答案 1 :(得分:2)

问题出在init

self.tcpClientdelegate? = client

后缀?的操作数为nil时,将不执行您指定的任何操作。

此处,self.tcpClientdelegate为零,因此未分配该值。

来自Swift Language Reference

  

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

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

self.tcpClientdelegate = client