Swift 2,2 и Objective-C Interoperability в Обработка ошибок
Это, кажется, происходит потому, что в Swift 2.2, методы Objective-C, которые берут NSError **
для последнего параметра преобразуются в методе Swift throws
эквивалент.
Дополнительную информацию по этой теме можно получить по адресу this page, используя 3-й и 4-й разделы, приведенные ниже.
Обработка ошибок (excerpt)
В какао, методы, которые производят ошибки принимают параметр NSError
указателя в качестве последнего параметра, который заполняет свой аргумент с NSError
объекта в случае возникновения ошибки. Swift автоматически переводит методы Objective-C, которые приводят к ошибкам в методах, которые вызывают ошибку в соответствии с встроенной функцией обработки ошибок Swift.
Для примера рассмотрим следующий метод Objective-C из NSFileManager
:
- (BOOL)removeItemAtURL:(NSURL *)URL
error:(NSError **)error;
В Swift, это импортное, как это:
func removeItemAtURL(URL: NSURL) throws
Ловля и обработка ошибки (excerpt)
В Objective-C обработка ошибок включена, что означает, что ошибки, вызванные вызовом метода, игнорируются, если не указан указатель ошибок. В Swift вызов метода, который выбрасывает, требует явной обработки ошибок.
Вот пример того, как обрабатывать ошибки при вызове метода в Objective-C:
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *fromURL = [NSURL fileURLWithPath:@"/path/to/old"];
NSURL *toURL = [NSURL fileURLWithPath:@"/path/to/new"];
NSError *error = nil;
BOOL success = [fileManager moveItemAtURL:URL toURL:toURL error:&error];
if (!success) {
NSLog(@"Error: %@", error.domain);
}
А вот эквивалентный код в Swift:
let fileManager = NSFileManager.defaultManager()
let fromURL = NSURL(fileURLWithPath: "/path/to/old")
let toURL = NSURL(fileURLWithPath: "/path/to/new")
do {
try fileManager.moveItemAtURL(fromURL, toURL: toURL)
} catch let error as NSError {
print("Error: \(error.domain)")
}
Кроме того, вы можете использовать комбинации catch для соответствия конкретным кодам ошибок в качестве удобного способа дифференцирования возможных условий отказа:
do {
try fileManager.moveItemAtURL(fromURL, toURL: toURL)
} catch NSCocoaError.FileNoSuchFileError {
print("Error: no such file exists")
} catch NSCocoaError.FileReadUnsupportedSchemeError {
print("Error: unsupported scheme (should be 'file://')")
}
Вопрос-специфический код
В этом примере кода, это означает, что в Swift 2.2, enableBroadcast(error:)
метод GCDAsyncUdpSocket
будет enableBroadcast() throws
и нужно будет использовать явное do-catch
.
Аналогично, beginReceiving()
метод GCDAsyncUdpSocket
превратится в beginReceiving() throws
и также потребует использование do-catch
.
Swift 2 - Думаю, вы говорите о Swift 2 - вводит новый синтаксис обработки ошибок. Это описано в руководстве по языку – vadian