【问题标题】:((Any) throws -> Bool) throws -> Optional<Any>') cannot conform to 'BinaryInteger'((Any) throws -> Bool) throws -> Optional<Any>') 不能符合 'BinaryInteger'
【发布时间】:2022-01-07 08:39:15
【问题描述】:

我在尝试从 Apple Watch 的 WC 会话 [String: Any] 转换消息时遇到问题,因为我正在自定义一个从 Apple Watch 检索心率并将其发送到 iPhone 的示例项目。我希望能得到一些帮助,因为我已经在手表连接上苦苦挣扎了 3 天。

我确实看到我从 Apple Watch 正确接收到消息,并且我即将利用收到的消息在 iOS 应用程序端更新心率。但我认为“guard let”语句导致 didReceiveMessage 函数中途停止。

我不确定,但我认为如果我可以将消息 ["rate": 61] 以双精度格式“解包”为 61,我应该能够通过 guard let 函数并使该函数正常工作。

除此之外,我看到另一个错误说“WCErrorCodeDeliveryFailed 否”,但我不确定为什么要填充这个错误,因为我已经从其他 SO 答案中实施了建议的解决方案。但我认为这个错误是多余的/与上述错误消息无关。

不胜感激。

import Foundation
import WatchConnectivity

protocol WatchKitConnectionDelegate: AnyObject {
    func didFinishedActiveSession()
    func updateLatestHeartRate(_ LatestHeartRate: Double)
}

protocol WatchKitConnectionProtocol {
    func startSession()
    func sendMessage(message: [String : AnyObject], replyHandler: (([String : AnyObject]) -> Void)?, errorHandler: ((NSError) -> Void)?)
}

class WatchKitConnection: NSObject {
    static let shared = WatchKitConnection()
    weak var delegate: WatchKitConnectionDelegate?
    
    private override init() {
        super.init()
    }
    
    func sendHeartRate(rate: Int) {
        WCSession.default.sendMessage(["rate": rate], replyHandler: nil) { error in
            print("Failed to send message: \(error)")
        }

        print("from iOS watchkit connection")
    }

extension WatchKitConnection: WatchKitConnectionProtocol {
    func startSession() {
        session?.delegate = self
        session?.activate()
    }
    
    func sendMessage(message: [String : AnyObject],
                     replyHandler: (([String : AnyObject]) -> Void)? = nil,
                     errorHandler: ((NSError) -> Void)? = nil)
    
    {
        validReachableSession?.sendMessage(message, replyHandler: { (result) in
            print(result)
            print("success in phone sendmessage function")
        }, errorHandler: { (error) in
            print("error in phone sendmessage function")
            print(error)
        })
    }
    
}

extension WatchKitConnection: WCSessionDelegate {

func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
        print("didReceiveMessage from watch")
        print(message)
        
        delegate?.updateLatestHeartRate(Double(message.values.first))
        
        guard let heartRate = message.values.first as? String? else {
            return
        }
        guard let heartRateDouble = Double(heartRate!) else {
            return
        }
        
        print("printing heartRate double from message\(heartRateDouble)")
        
        delegate?.updateLatestHeartRate(heartRateDouble)
        
        print("updateLatestHeartRate")
      }

iOS 应用中的 WatchKitConnection Swift 文件

【问题讨论】:

  • 是的,您需要安全地打开您的可选值。您尝试在下一行打开 message.values.first 之前使用它。先解包,然后将其传递给您的委托方法。
  • 另外,message.value.first 真的是String 吗?还是Int?如果它是一个字符串,你会在其中有一个额外的?,例如,它应该是guard let heartRate = message.values.first as? String else { ... }(注意,不是String?)。
  • 根据 print 语句假设它是 Int 时要小心。但如果是整数,则为guard let heartRate = message.values.first as? Int else { ... }
  • 另外,我在那里看到了一个!。你真的想避免做强制解包操作,好像它失败了,它会崩溃。但是如果你删除了那个无关的?,你就不需要强制解包了……
  • 我很高兴您发布自己的答案。您将能够在一天左右的时间内接受它...

标签: ios swift watchos watchconnectivity


【解决方案1】:

@Rob in the comments 的帮助下,我能够正确解包消息并删除不必要的保护让语句来运行我的委托函数。以下是更新后的代码。

  1. message.values.first? 更改为Int,因为速率是整数格式。
  2. 删除了将 heartRate 转换为双精度格式的 guard let 语句,因为它是非可选的。
extension WatchKitConnection: WCSessionDelegate {

func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
        print("didReceiveMessage from watch")
        print(message)
        
//        delegate?.updateLatestHeartRate(Double(message.values.first))
        
        guard let heartRate = message.values.first as? Int else {
            return
        }
        
        let heartRateDouble = Double(heartRate)
        
        print("printing heartRate double from message\(heartRateDouble)")
        
        delegate?.updateLatestHeartRate(heartRateDouble)
        
        print("updateLatestHeartRate")
        
    }
}

【讨论】:

    猜你喜欢
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 2022-12-16
    • 1970-01-01
    • 2021-06-14
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多