2016-07-04 2 views
2

Я работаю в Swift 3, и я испытываю проблемы со следующим, если позволить тест:Swift 3: 'если давайте опциональный связывание ошибка

let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist") 

if let plistData = try Data(contentsOf: plistUrl!) { 
    ...some code 
} 

Компилятор показывает следующую ошибку на, если позволить заявление :

Initializer for conditional binding must have Optional type, not 'Data' 

В чем проблема, и как я могу ее исправить?

ответ

4

try не возвращается. try?.

+0

Это сделал трюк! Я знал, что это должно быть чем-то глупо простым. –

0

С помощью Swift правильный способ обработки ошибок и извлечения данных из методов, которые могут вызывать ошибки, объясняется в разделе Error Handling «Язык программирования Swift».

Поэтому, в соответствии с вашими потребностями, вы можете выбрать один из трех следующих шаблонов, чтобы решить вашу проблему.


1. Получение данных и обработка ошибок с помощью do-catch и try ключевого слова

Вы используете do-catch заявления для обработки ошибок, запустив блок кода. Если ошибка вызывается кодом в предложении do, она сопоставляется с предложениями catch, чтобы определить, какая из них может обрабатывать ошибку.

Использование:

let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist")! 

let plistData: Data? 
do { 
    plistData = try Data(contentsOf: plistUrl) 
} catch { 
    print(error as NSError) 
    plistData = nil 
} 

print(plistData) 

2. Получение данных и преобразования ошибок в дополнительных значений с помощью ключевого слова try?

Вы используете try? обрабатывать ошибку, превращая его в дополнительный стоимость. Если при вычислении выражения try? возникает ошибка, значение выражения равно нулю.

Использование:

let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist")! 

guard let plistData = try? Data(contentsOf: plistUrl) else { 
    return 
} 

print(plistData) 

3. Получение данных и распространение отключаем ошибок с использованием ключевого слова try!

Иногда вы знаете функцию метательный или метод не будет, на самом деле, вывести ошибку во время выполнения. В этих случаях вы можете написать try! перед выражением, чтобы отключить распространение ошибок и завернуть вызов в заявлении о запуске, чтобы никакая ошибка не была выбрана. Если на самом деле возникает ошибка, вы получите ошибку времени выполнения.

Использование:

let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist")! 

let plistData = try! Data(contentsOf: plistUrl) 

print(plistData) 
Смежные вопросы