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

时间:2018-06-14 08:32:17

标签: ios swift swift2.3 swift3.2

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

下面是我的编码内容,我正面临一些问题。

错误:

  

不能使用String

类型的索引下标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很新。无法理解这种类型的错误。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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。这很可能不是故意的。