Сравните Обработка объектов ошибок, возвращаемых методами в "Руководстве по программированию обработки ошибок":
Важно! Успех или неудача указываются возвращаемым значением метода. Хотя методы Cocoa, которые косвенно возвращают объекты ошибок в домене ошибок Cocoa, гарантированно возвращают такие объекты, если метод указывает на сбой, напрямую возвращая nil или NO, вы всегда должны проверять, что возвращаемое значение равно nil или NO, прежде чем пытаться что-либо сделать с Объект NSError.
Поэтому для методов Cocoa/Cocoa Touch вы всегда должны сначала проверять возвращаемое значение. Гарантируется, что error != nil
в случае сбоя метода, но явно не гарантируется, что error == nil
в случае успеха метода.
Примеры:
Сериализация JSON
var error : NSError?
if let jsonObj = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) {
// success
} else {
// failure
println("Invalid JSON data: \(error!.localizedDescription)")
}
Запрос на получение основных данных
var error : NSError?
if let result = context.executeFetchRequest(request, error: &error) {
// success, result has zero or more elements
} else {
// failure
println("Fetch failed: \(error!.localizedDescription)")
}
Копирование файлов
var error : NSError?
if !NSFileManager.defaultManager().copyItemAtPath(srcPath, toPath: dstPath, error: &error) {
println("Cannot copy file: \(error!.localizedDescription)")
}
Конечно, вы можете определить свои собственные правила для своих собственных функций, но я бы следовал тем же рекомендациям Apple.
Обновление: в Swift 2 методы Cocoa, которые вызывают ошибки, преобразуются в функции Swift, которые вызывают ошибку, и эта ошибка должна обрабатываться с помощью try
-catch
. Вот версия приведенных выше примеров для Swift 2:
Сериализация JSON
do {
let jsonObj = try NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
// success
} catch let error as NSError {
// failure
print("Invalid JSON data: \(error.localizedDescription)")
}
Запрос на получение основных данных
do {
let result = try context.executeFetchRequest(request)
// success, result has zero or more elements
} catch let error as NSError {
// failure
print("Fetch failed: \(error.localizedDescription)")
}
Копирование файлов
do {
try NSFileManager.defaultManager().copyItemAtPath(srcPath, toPath: dstPath)
} catch let error as NSError {
print("Cannot copy file: \(error.localizedDescription)")
}
person
Martin R
schedule
01.04.2015