【问题标题】:Loop through an optional object in Swift 4遍历 Swift 4 中的可选对象
【发布时间】:2018-12-07 19:42:39
【问题描述】:

我有这个代码

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-check。

我试过了

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")
    }

}

我一直得到

二元运算符“!=”不能应用于“任何?”类型的操作数和“字符串?”

如何进一步调试?

【问题讨论】:

  • 好吧,问题是你为什么还要使用像[String: [String: Any]] 这样丑陋的类型?为什么不使用结构体,fcmToken 实际上会被定义为String 类型?

标签: ios arrays swift dictionary optional


【解决方案1】:

你有:

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")
    }
}

效果是一样的,没有错误。

【讨论】:

    【解决方案2】:

    你可以试试

    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时它不会起作用

    【讨论】:

    • 如何循环访问我的令牌并运行 if-check () ?
    • 让我看看,我现在就去看看。
    • 你的回答有错别字toekn除此之外,我现在正在尝试。
    • 或者简化为if ($0["fcmToken"] as? String) != fcmToken {,当然,这仍然不是最优解。最佳解决方案是首先将那个丑陋的嵌套无类型字典转换为结构。
    • @kyo 很明显,单引号和双引号有错别字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2015-10-17
    • 2021-06-16
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多