我创建了如下协议:
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 Delegate为nil!如果我创建不带问号的委托,代码将按预期工作。但当我使用可选类型时,我不能将viewcontroller类指定为委托。
由于self.tcpClientdelegate
是nil
,因此附加?
运算符将导致整个语句无法运行=>这将导致该委托未被分类=nil
self.tcpClientdelegate? = client
所以用代替
self.tcpClientdelegate = client
问题在于init
:
self.tcpClientdelegate? = client
如果后缀?
运算符的操作数是nil
,它将不会执行您指定的任何操作。
这里,self.tcpClientdelegate
为零,因此不分配该值。
来自Swift语言参考:
可选的链接表达式必须出现在后缀表达式中,并且它们导致后缀表达式在一个特殊的方式如果可选链接表达式的值为nil,则所有后缀表达式中的其他操作被忽略整个后缀表达式的计算结果为零
只需正常分配即可解决问题,因为您不关心self.tcpClientdelegate
是否为nil
:
self.tcpClientdelegate = client