Я пытаюсь сделать 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
}
Вы можете получить доступ к 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)
Основной блок 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
как единую инструкцию по управлению программой. Между ними не делается никаких заявлений. Проверяются только условия. У вас может быть несколько условий, разделенных запятыми (,).
Из документации говорится:
Любые константы или переменные, присваиваемые значения из необязательного объявления привязки в условии утверждения охраны, могут использоваться для остальных операторов охраны, охватывающих область.
Ваша 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!)