Цикл по необязательному объекту в Swift 4 - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть этот код

let dic = snapshot.value as! [String:[String:Any]]
Array(dic.values).forEach {
    print($0["fcmToken"])
}

Он производит эти 3

Optional(c1DdtdDF1Rs:APA91bGJBUD65nidQiFDO90AVNgq0wiMjUaZmZXVJ8c_tYmFe5dkmgweOdO10jzPRlMVZF_qNyWMMsu7EhA5IMVo3jLWvBThDteR7WWUPqau-ZFAHKQPHgI5Vb48vA-_4nwkZCKrOVoT)
Optional(c1DdtdDF1Rs:APA91bGJBUD65nidQiFDO90AVNgq0wiMjUaZmZXVJ8c_tYmFe5dkmgweOdO10jzPRlMVZF_qNyWMMsu7EhA5IMVo3jLWvBThDteR7WWUPqau-ZFAHKQPHgI5Vb48vA-_4nwkZCKrOVoT)
Optional(c1DdtdDF1Rs:APA91bGJBUD65nidQiFDO90AVNgq0wiMjUaZmZXVJ8c_tYmFe5dkmgweOdO10jzPRlMVZF_qNyWMMsu7EhA5IMVo3jLWvBThDteR7WWUPqau-ZFAHKQPHgI5Vb48vA-_4nwkZCKrOVoT)

Я хочу просмотреть их и добавить простую проверку if.

Iпробовал

let dic = snapshot.value as! [String:[String:Any]]
Array(dic.values).forEach {
    print($0["fcmToken"])

    if($0["fcmToken"] != fcmToken) {
        print("token is not match detected")
    }

}

Я продолжал получать

Двоичный оператор '! =' нельзя применить к операндам типа 'Any?'и 'String?'

Как можно отладить это дальше?

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

У вас есть:

let dic = snapshot.value as! [String:[String:Any]]
Array(dic.values).forEach {
    print($0["fcmToken"])
    if($0["fcmToken"] != fcmToken) {
        print("token is not match detected")
    }
}

Но это дает вам ошибку компиляции.Предполагая, что эта строка работает:

let dic = snapshot.value as! [String:[String:Any]]

Остальное я напишу так:

for v in dic.values {
    if let token = v["fcmtoken"] as? String, token != fcmtoken {
        print("token \(token) is not match detected")
    }
}

Эффект тот же, и ошибки нет.

0 голосов
/ 07 декабря 2018

Вы можете попробовать

let dic = snapshot.value as! [String:[String:Any]]
let tokens = Array(dic.values).map { $0["fcmToken"] as! String }
let exists = tokens.contains(fcmToken)

Ваша проблема как $0["fcmToken"] относится к типу Any?, который нельзя сравнить с типом String? (fcmToken)


let dic = snapshot.value as! [String:[String:Any]]
Array(dic.values).forEach {
    print($0["fcmToken"])

    if let token =  $0["fcmToken"] as? String , token != fcmToken {
        print("token is not match detected")
    }

   // or

    if  ($0["fcmToken"] as? String) != fcmToken {
        print("token is not match detected")
    }

}

Вы можете безопасно использовать

guard let dic = snapshot.value as? [String: [String:Any]] else {
  return
}

, но он не будет работать, если значение равно nil

...