Развертывание значения с помощью Swift JSON приводит к ошибке на iOS13 - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть внешний API, предоставляющий данные, которые мне нужно декодировать и назначить метке в моем представлении.

Я использую следующее в collectionView, так что не обращайте внимания на collectionView.tag и indexPath.row

Я также использую SwiftyJson для анализа json значений .string, предоставляя и необязательное значение

let value = servicesResponse["data"][collectionView.tag]["subcategories"][indexPath.row]["name"].string

Теперь, когда я пытаюсь присвоить это значение метке

cell.serviceName.text = value

Я получаю сообщение об ошибке:

'NSInvalidArgumentException', reason: '*** -[NSPlaceholderString initWithString:]: nil argument'

Я должен был поместить значение в нечто подобное при назначении:

`"\(value)"`

Это работает нормально, но имеет Optional текст вокруг значений.

Я также пытался:

  • развернуть значение cell.serviceName.text = value! дает ту же ошибку
  • используется .stringValue вместо .string, что дает необязательное значение, дает ту же ошибку - используется .rawString вместо .string дает ту же ошибку
  • попытался развернуть его таким образом
if let value = servicesResponse["data"][collectionView.tag] 
   ["subcategories"][indexPath.row]["name"].string {
        cell.serviceName.text = value
}

та же ошибка

  • и попытался присвоить ей значение по умолчанию cell.serviceName.text = value ?? "default" та же ошибка

я просто попытался проверить все ответ на один такой:

if servicesResponse["data"] != JSON.null{
            if servicesResponse["data"][collectionView.tag] != JSON.null{
                if servicesResponse["data"][collectionView.tag]["subcategories"] != JSON.null{
                    if servicesResponse["data"][collectionView.tag]["subcategories"][indexPath.row] != JSON.null{
                        if servicesResponse["data"][collectionView.tag]["subcategories"][indexPath.row]["name"] != JSON.null{
                            print("ALL PASS=========================")
                        }
                    }
                }
            }
        }

и весь проход

Я хотел бы знать, есть ли способ удалить текст Optional, пока значение по-прежнему необязательно или если кто-то знает, что означает эта ошибка и почему она возникает.

Ошибка возникает только на iOS13. отлично работает на более ранних версиях

Спасибо.

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

Переменная value является необязательной строкой, поэтому при печати она показывает Optional().

Чтобы развернуть необязательную строку, вы можете сделать что-то вроде этого:

if let unwrappedValue = value {
    cell.serviceName.text = unwrappedValue
}

Или, если хотите, вы можете сделать это в одну строку с оператором объединения nil:

cell.serviceName.text = value ?? "Text in case of nil"
0 голосов
/ 25 февраля 2020

Ошибка показывает, что строка инициализируется с нулевым аргументом, поэтому что-то не так с данными json или способом их декодирования.

Почему бы вам не выполнить развертывание поэтапно , а не один лайнер. Когда вы сталкиваетесь с неизвестной ошибкой, всегда лучше разбить процесс на небольшие куски, а затем проанализировать каждый в отдельности. Когда вы обнаружите, в чем ваша проблема, вы всегда можете go вернуться к одному вкладышу, применяя то, что вы узнали.

Это то, что я придумал (и протестировал), чтобы проиллюстрировать один из способов отладка в процессе постепенного JSON декодирования.

Учитывая необработанную строку json:

let rawString = """
{"statusCode":200,"message":"Success","data":[{"_id":"someid","isActive":true,"subcategories":[{"_id":"id","photo":"image/url/30973327066756228460065.png","services":[{"_id":"id","properties":[{"_id":"id","isMultiSelect":false,"responses":["1","2","3","4","5"],"other_name":"የክፍሎች ቁጥር","name":"Number of rooms"}],"other_name":"ጽዳት","name":"Cleaning"}],"other_name":"ጽዳት","name":"Cleaning","other_subcategory_label":"ጽዳት","subcategory_label":"Cleaning"}],"name":"Home Cleaning","__v":0,"other_name":"የቤት ጽዳት"}]}
"""

Мы можем постепенно декодировать, проверять и затем разворачивать значение имени в конце.

let parsedJson = JSON.init(parseJSON: rawString)

let verifiedDataJson = parsedJson["data"]
guard verifiedDataJson != JSON.null else {
    return
}

let verifiedCollectionViewTagJson = verifiedDataJson[0]
guard verifiedCollectionViewTagJson != JSON.null else {
    return
}

let verifiedSubCategoriesJson = verifiedCollectionViewTagJson["subcategories"]
guard verifiedSubCategoriesJson != JSON.null else {
    return
}

let verifiedIndexPathRowJson = verifiedSubCategoriesJson[0]
guard verifiedIndexPathRowJson != JSON.null else {
    return
}

guard let unwrappedNameValue = verifiedIndexPathRowJson["name"].string as String? else {
    return
}
0 голосов
/ 25 февраля 2020

Это потому, что ваше значение является необязательным.

Попробуйте через этот способ

if let value = servicesResponse["data"][collectionView.tag]["subcategories"][indexPath.row]["name"] {
    cell.serviceName.text = value.stringValue
}
...