我创建了如下协议:
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类分配为委托。
答案 0 :(得分:2)
由于self.tcpClientdelegate
是nil
,所以附加?
运算符将导致整个语句无法运行=>,这将导致该委托被取消声明= nil
self.tcpClientdelegate? = client
所以替换为
self.tcpClientdelegate = client
答案 1 :(得分:2)
问题出在init
:
self.tcpClientdelegate? = client
后缀?
的操作数为nil
时,将不执行您指定的任何操作。
此处,self.tcpClientdelegate
为零,因此未分配该值。
可选链接表达式必须出现在后缀表达式中, 并且它们使后缀表达式以特殊形式求值 办法。 如果可选链接表达式的值为nil,则所有 后缀表达式中的其他操作被忽略,并且 整个后缀表达式的计算结果为nil。
只需正常分配它即可解决问题,因为您不必担心self.tcpClientdelegate
是否为nil
:
self.tcpClientdelegate = client