Невозможно подписать значение типа NSDictionary индексом типа String. При конвертации из Swift 2.3 -> 3.2

Мне нужна помощь. При преобразовании из Swift 2.3 -> 3.2 я получил ошибку ниже. Я не могу решить эту ошибку.

Ниже приведены мои коды, где я столкнулся с некоторыми проблемами.

Ошибка :

Не удается подписать значение типа NSDictionary индексом типа String

В этой строке: 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. Не могу понять этот тип ошибки.


person A.K.Deshmukh    schedule 14.06.2018    source источник
comment
Не используйте классы NS в Swift, такие как NSDictionary. Используйте Dictionary или [String: Any]   -  person Scriptable    schedule 14.06.2018
comment
... и не аннотируйте типы, которые может вывести компилятор.   -  person vadian    schedule 14.06.2018
comment
@vadian, пожалуйста, не могли бы вы мне помочь... я не могу решить эту проблему.   -  person A.K.Deshmukh    schedule 14.06.2018
comment
Каким (статическим) типом должен быть tempValue? Конечно нет AnyObject   -  person vadian    schedule 14.06.2018
comment
Пожалуйста, проверьте мой обновленный квест. я вставил весь код   -  person A.K.Deshmukh    schedule 14.06.2018
comment
Надеюсь, это поможет вам предсказать правильный способ решения моего запроса.   -  person A.K.Deshmukh    schedule 14.06.2018
comment
Это не отвечает на мой вопрос. Каков ожидаемый тип tempValue? String, Int или как?   -  person vadian    schedule 14.06.2018
comment
Это тип String   -  person A.K.Deshmukh    schedule 14.06.2018


Ответы (2)


Используйте нативные типы

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 на каждой итерации. Скорее всего это не предусмотрено.

person vadian    schedule 14.06.2018
comment
Привет @vadian, не могли бы вы помочь мне в этом вопросе: stackoverflow.com/q/50855040/9940506 - person A.K.Deshmukh; 14.06.2018

Лучший ответ — использовать нативные типы Swift. Альтернативой является преобразование ваших индексов в NSString.

...
if let tempValue:AnyObject = tempDict["value" as NSString]  {
...
person Avi    schedule 14.06.2018