Ожидается еще после заявления охранника, но еще есть, почему он жалуется?

-1

Я пытаюсь сделать PropertyListSerialization в отличие от использования только NSDictionary(contentsOfFile:) поэтому я изменил код для этого. Теперь, используя guard, я должен дать else. Я предоставляю else. Какую ошибку я делаю в этой строке кода?

В нем говорится:

Ожидается "еще" после состояния "стража".

Эта строка кода при использовании NSDictionary(contentsOfFile:) работает нормально. Но это изменение в PropertyListSerialization не работает для меня.

        guard
            let filePathValue = filePath,
//            let fileContentDictionary:NSDictionary = NSDictionary(contentsOfFile: filePathValue)
        let data = try? Data(contentsOf: filePathValue as URL),

        let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [[String:Any]]
            print(result!)

        else{
            return
        }

Изображение 174551

  • 1
    Вы написали печать (результат!) Между
  • 0
    Волшебно Да, не могли бы вы объяснить, почему печать (результат!) Не дает проблемы. Я хочу напечатать результат, что мне делать?
Теги:

3 ответа

1
Лучший ответ

Вы можете получить доступ к result после этого else блоки также, если ваш ответ является dictionary, то вам нужно отбрасывать результат propertyList(from:options:format:) на [String:Any] а не [[String:Any]], потому что это толковый словарь.

guard let filePathValue = filePath,
    //let fileContentDictionary: NSDictionary = NSDictionary(contentsOfFile: filePathValue)
    let data = try? Data(contentsOf: filePathValue as URL),
    let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [String:Any] //not [[String:Any]]
else {
    return
}
//Result is still optional
print(result!)

Теперь, как вы использовали try? ваш результат по-прежнему является необязательным, поэтому, если вы хотите, чтобы результат не был необязательным, используйте функцию () с помощью try? как это.

guard let filePathValue = filePath,
    //let fileContentDictionary: NSDictionary = NSDictionary(contentsOfFile: filePathValue)
    let data = try? Data(contentsOf: filePathValue as URL),
    let result = (try? PropertyListSerialization.propertyList(from: data, options: [], format: nil)) as? [String:Any] //not [[String:Any]]
else {
    return
}
//Now result is non-optional
print(result)
1

Основной блок guard-else выглядит следующим образом:

guard 'condition' else {
    'statements'
}

Пример:

guard let name = optionalName else {
    // Value requirements not met, do something.
    // name isn't available here
    return
}
// Value requirements met, do something with name
// name is available here
// Rest of the code goes here

Вы должны рассматривать guard-else как единую инструкцию по управлению программой. Между ними не делается никаких заявлений. Проверяются только условия. У вас может быть несколько условий, разделенных запятыми (,).

Из документации говорится:

Любые константы или переменные, присваиваемые значения из необязательного объявления привязки в условии утверждения охраны, могут использоваться для остальных операторов охраны, охватывающих область.

1

Ваша print(result!) Является проблемой.

Убери это.

Обновить:

guard let filePathValue = filePath,
      //let fileContentDictionary: NSDictionary = NSDictionary(contentsOfFile: filePathValue)
      let data = try? Data(contentsOf: filePathValue as URL),
      let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [[String:Any]]
else {
    return
}

print(result!)
  • 0
    Пожалуйста, объясните, почему это проблема, как я могу напечатать результат, если я хочу.
  • 0
    @KumarUtsav проверить обновление

Ещё вопросы

Сообщество Overcoder
Наверх
Меню