ios - 发送一个枚举,它是字典上的元组并返回

标签 ios swift notifications tuples swift5

我是 Swift 的新手,请原谅我的无知。

我有这个枚举:

public enum ConnectionResult {
  case values(state: MCSessionState, peerID:MCPeerID)
}

我把它记在字典上

let dict = ["values" : ConnectionResult.values(state:state, peerID:peerID)]

我通过通知发送这个口述

NotificationCenter.default.post(name: .adjustState, object: dict)

当我收到通知时,我想返回statepeerID

@objc private func onAdjustState(_ notification:Notification) {
  if let dict = notification.object as? Dictionary<String,Any>,
  let result = dict["values"] as? ConnectionResult {

}

如何从结果中获取状态和 peerID?

我试过了

let state = result.values.state as? MCSessionState

我试过了

let (state, peerID) = result  // the thing is a tuple, right?

没有成功...

顺便问一下,有没有办法直接在通知上发送这个 ConnectionResult 对象,这是一个元组,而不是使用字典?

最佳答案

ConnectionResult 不是元组。它是一个只有一种情况的枚举(这违背了枚举的目的),因此您需要像处理枚举一样处理它。

获取状态peerID:

if case .values(let state, let peerID) = result {
    // you can access "state" and "peerID" here
} else {
    // this will never be reached
}

您可能会说,枚举在这里不合适。我建议更改为实际的元组:

// create the dict like this
let dict = ["values" : (state:state, peerID:peerID)]

// get state and peerID like this
if let result = dict["values"] as? (state: MCSessionState, peerID: MCPeerID) {
    let (state, peerID) = result
} else {
    // handle "dict["values"] as? (state: MCSessionState, peerID: MCPeerID)" being nil
}

结构:

struct ConnectionResult {
    let state: MCSessionState
    let peerID: MCPeerID
}

// create the dict like this
let dict = ["values" : ConnectionResult(state:state, peerID:peerID)]

// get state and peerID like this
if let result = dict["values"] as? ConnectionResult {
    let (state, peerID) = (result.state, result.peerID)
} else {
    // handle "dict["values"] as? ConnectionResult" being nil
}

您也可以直接发送结构/元组,而无需先将其放入字典中,因为object 参数接受Any?。您只需将 notification.object 直接转换为结构类型或元组类型即可。

关于ios - 发送一个枚举,它是字典上的元组并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59907517/

相关文章:

ios9 UIAlertController uitextfield 太小

ios - 如何将 selectedSegmentIndex 的值传递给另一个 viewController?

swift - 无法让 XPC 从客户端接收数据

Android - 如何将正在进行的事件放在状态栏上而不是通知屏幕上?

android - Android 推送通知可靠吗?

ios - iOS 上的 CGImage 旋转方法内存泄漏

ios - 如何使用AFHTTPSessionManager记录每个请求/响应?

Swift:枚举中元素的索引(CaseIterable)

ios - Realm 设置自定义文件URL混淆

android - 如何防止 Activity 重复午餐