![](/img/trans.png)
[英]Issue with passing UIViewcontroller carrying delegate as parameter to swift function
[英]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.tcpClientdelegate
为nil
因此追加?
运算符将导致整个语句无法运行=>这将导致该委托被取消声明= 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.