1

我正在做一个 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部分,这很奇怪。

4

0 回答 0