不能使用 String 类型的索引为 NSDictionary 类型的值下标。从 Swift 2.3 -> 3.2 转换时

Posted

技术标签:

【中文标题】不能使用 String 类型的索引为 NSDictionary 类型的值下标。从 Swift 2.3 -> 3.2 转换时【英文标题】:Cannot subscript a value of type NSDictionary with an index of type String. While converting from Swift 2.3 -> 3.2 【发布时间】:2018-11-23 23:16:03 【问题描述】:

我需要帮助。从 Swift 2.3 -> 3.2 转换时,我收到以下错误。我无法解决此错误。

以下是我的编码资料,我遇到了一些问题。

错误:

不能用字符串类型的索引为 NSDictionary 类型的值下标

在这一行:if let tempValue:AnyObject = tempDict["value"]

if (productToReturn.planoRetailPackSize == nil || productToReturn.planoRetailPackSize == "0.0") 
            if let dataToProcess:NSDictionary = dict["data"] as? NSDictionary 
                    if let productDataRecord:NSDictionary = dataToProcess["productDataRecord"] as? NSDictionary
                        if let module:NSArray = productDataRecord["module"] as? NSArray
                            for (_,value) in module.enumerated()
                                if let parentDic:NSDictionary = value as? NSDictionary
                                    if let cpmChild:NSDictionary = parentDic["cem:canadaExtensionModule"] as? NSDictionary 
                                        if let tempDict:NSDictionary = cpmChild["retailPackSize"] as? NSDictionary 
                                                if let tempValue:AnyObject = tempDict["value"]   //Error is Here
                                                let myValue: String = String(describing: tempValue)
                                                productToReturn.planoRetailPackSize = myValue
                                    
                                //item
                            
                        

                        
                    
                
            
        

请帮助我。我对 ios 很陌生。无法理解此类错误。

【问题讨论】:

不要在 Swift 中使用 NS 类,例如 NSDictionary。使用Dictionary[String: Any] ...并且不要注释编译器可以推断的类型。 @vadian plz 你能帮我吗...我无法解决它。 tempValue 应该是什么(静态)类型?当然不是 AnyObject 请检查我更新的任务。我已经粘贴了所有代码 【参考方案1】:

使用原生类型

if let dataToProcess = dict["data"] as? [String:Any],
    let productDataRecord = dataToProcess["productDataRecord"] as? [String:Any],
    let module = productDataRecord["module"] as? [[String:Any]] 
    for value in module 
        if let cpmChild = value["cem:canadaExtensionModule"] as? [String:Any],
            let tempDict = cpmChild["retailPackSize"] as? [String:Any],
            let myValue = tempDict["value"] as? String 
            productToReturn.planoRetailPackSize = myValue
        
    

注意:在for 循环中,myValue 将在每次迭代中覆盖planoRetailPackSize。这很可能不是故意的。

【讨论】:

嗨@vadian 你能帮我解决这个问题吗:***.com/q/50855040/9940506【参考方案2】:

最好的答案是使用原生 Swift 类型。另一种方法是将您的下标转换为NSString

...
if let tempValue:AnyObject = tempDict["value" as NSString]  
...

【讨论】:

以上是关于不能使用 String 类型的索引为 NSDictionary 类型的值下标。从 Swift 2.3 -> 3.2 转换时的主要内容,如果未能解决你的问题,请参考以下文章

不能为“[(String)] 类型的值下标?”具有“Int”类型的索引

无法使用“String”类型的索引为“[[String : Any]]”类型的值下标

无法使用“Int”类型的索引为“[String : String]”类型的值下标

TS2538:类型“唯一符号”不能用作索引类型

swift: 不能用字符串类型的索引下标 [Dictionary<String, AnyObject>] 类型的值

无法使用“String”类型的索引为“[String : AnyObject]”类型的值下标