Отправка перечисления, являющегося кортежем в словаре и обратно - PullRequest
0 голосов
/ 25 января 2020

Я новичок в Swift, так что извините за мое невежество.

У меня есть это перечисление:

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

Я положил это в словарь

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

I отправить это сообщение через уведомление

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

Когда я получу уведомление, я хочу получить значения state и peerID обратно

@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, который является кортежем, непосредственно в уведомлении вместо использования словаря?

1 Ответ

2 голосов
/ 25 января 2020

ConnectionResult не является кортежем. Это перечисление только с одним случаем (который побеждает цель перечисления), поэтому вам нужно обращаться с ним как с перечислением.

Чтобы получить state и 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:

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 непосредственно к типу структуры или типу кортежа.

...