我正在做一个 WatchKit 应用程序,我遇到了一个非常奇怪的行为,我认为这可能与 WatchKit 无关,但是编译器的行为有些奇怪,虽然不确定编译器是否是罪魁祸首,但这就是我的怀疑。
场景基本上是这样的:用户点击手表应用程序上的一个按钮,手表应用程序使用WCSession.default.sendMessage
如下方式发送消息:
WCSession.default.sendMessage([
"request": "AmsterdamData",
]) { [weak self] (resultDictionary) in
guard let self = self else {
return
}
// Some implementation
print("Message Received")
} errorHandler: { (error) in
print("SessionActivationState", "Error Occurred", error)
}
然后 iOS 应用程序收到消息session:didReceiveMessage:
(我已经确认每次都会被调用)并发回消息:
func session(_ session: WCSession, didReceiveMessage message: [String: Any], replyHandler: @escaping ([String: Any]) -> Void) {
print("didReceiveRequestMessage on iPhone: \(message)")
guard let request = message["request"] as? String else {
return
}
switch request {
case "AmsterdamData":
var dataToSend: String? = "hello"
replyHandler([
"AmsterdamData": dataToSend
])
default:
return
}
}
好的,这可行,我在sendMessage
函数的结果闭包中得到消息。好的。但是编译器抱怨并给了我一个轻微的警告
好的,谢谢你提醒我。我可以通过 a 轻松做到这一点as Any
(这是 XCode 向我推荐的)并且是有道理的,因为警告听起来像这样 = 表达式被“隐式”强制从String?
to Any
,我们只是让它显式。好的,现在像这样传递值,这样我们就可以得到 XCode 的黄色闪亮剑的保护(大警告的隐喻)
replyHandler([
"AmsterdamData": dataToSend as Any
])
即使考虑到 Xcode 给出的消息,我也不认为这会导致实际运行的逻辑产生(大)差异,它只会通过明确地执行已经明确的操作来使警告静音
事实证明,如果我这样做as Any
,函数中手表应用程序上的结果闭包sendMessage
将不会被调用,它的错误闭包也不会被调用。什么都没有发生,等待它的死亡天使杀死进程(或者如果你有一个保留周期,则不会)。但是,这让我想,是不是我严重误解了什么?当 Xcode 消息说它是隐式执行时,它是否不准确,所以让我们明确地执行它?
我尝试了 20 次,以确保它不是连接错误或某事。实际上只是因为那as Any
部分,这很奇怪。