【问题标题】:NSMutableDictionary: Cast to unrelated Swift type?NSMutableDictionary:转换为不相关的 Swift 类型?
【发布时间】:2015-09-14 12:46:26
【问题描述】:

谁能帮助我解决这个问题,我尝试了各种版本,但总是遇到错误或警告。下面的代码和输出来自 Swift Playground。

var foundationDict = NSMutableDictionary()
foundationDict.setObject("Bilbo", forKey: "FirstName")
foundationDict.setObject("Baggins", forKey: "LastName")

var swiftDict = foundationDict as! Dictionary<String, String>
for (key, value) in swiftDict {
    print("KEY: \(key) VALUE: |\(value)")
}

输出:

KEY: FirstName VALUE: |Bilbo
KEY: LastName VALUE: |Baggins

警告:

Cast from NSMutableDictionary to unrelated type Dictionary<String String> always fails

【问题讨论】:

    标签: swift dictionary casting nsmutabledictionary


    【解决方案1】:

    我不知道为什么,但是这样表述可以使警告静音:

    var swiftDict = (foundationDict as NSDictionary) as! Dictionary<String, String>
    

    在这种情况下,类型系统似乎与 NSMutableDictionary/NSDictionary 发生了冲突。

    【讨论】:

    • 在将foundationDict 转换为NSDictionary 之后,我也注意到了同样的情况。这似乎有点奇怪,因为 swiftDict 无论如何都是可变的。感谢您的浏览,非常感谢。
    【解决方案2】:

    您的代码的正确版本是:

    var foundationDict = NSMutableDictionary()
    foundationDict.setObject("Bilbo", forKey: "FirstName")
    foundationDict.setObject("Baggins", forKey: "LastName")
    
    for (key, value) in foundationDict {
       println("KEY: \(key) VALUE: |\(value)")
    }
    

    不需要强制转换,因为 NSDictionary 已桥接到 swift Dictionary 并且foundationDict 现在是 swift mutableDict。

    【讨论】:

    • 我转换为 Swift 的意图是我有很多其他函数将字典作为参数。我希望所有这些都是 Swift 原生的,这样如果 Apple 将来决定扩展 Dictionary 以涵盖 NSDictionary 的功能,我就不必在下游进行任何更改。
    • Swift 桥接会处理好,不用担心。
    • 我会试一试,看看我的进展如何,谢谢你的时间。
    【解决方案3】:

    你可以毫无预警地照着这条路走

    var addressDict = NSMutableDictionary()
    addressDict["key"] = "value"
    
    if let dict = (addressDict as NSDictionary) as? [String:AnyObject]  {
        print(dict) 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多