Как сравнить NSError.code с # определенным номером ошибки в Swift 5 - PullRequest
0 голосов
/ 10 июля 2019

Я работаю с Objective-C в течение нескольких лет, но я все еще новичок в Swift.

В настоящее время я работаю над добавлением нового кода на основе Swift 5 в существующий Objective-C.проект, который использует определенные константы для кодов ошибок и NSError объекты для распространения ошибок.

Как я могу использовать NSError.code в Swift?

Код Obective-C:

#define someStrangeError_Code   1000
typedef void(^CompletionHandler)(BOOL success, NSError *error);

...

- (void)doSomethingAsync:(CompletionHandler)completion {
    // ... do something

    if (errorOccured) {
        completion(false, [NSError errorWithDomain:@"MyErrorDomain" code:someStrangeError_Code userInfo:nil])
    } else {
        completion(true, nil)
    }

    ...
}    

[someObjc doSomethingAsync:^(BOOL success, NSError *error) {
    if (error != nil && error.code == someStrangeError_Code) {
        ....
    }
}];

Код Swift:

someObjc.doSomethingAsync(completion: { (success, error) in 
    if ((error as NSError?)?.code == someStrangeError_Code) {
        // ERROR
        // Binary operator '==' cannot be applied to operands of type 'Int?' and 'Int32'
    }
})

Я знаю, что Swift использует протокол Error вместо NSError.Однако NSError соответствует Error и, следовательно, использование NSError не должно быть проблемой, не так ли?

Сравнение простого кода ошибки с константой не должно быть таким сложным, но я не мог решитьthis.

Так что же является правильным "быстрым способом" проверки кода ошибки, чтобы избежать

Двоичный оператор '==' нельзя применять к операндам типа 'Int?'и 'Int32'

1 Ответ

1 голос
/ 10 июля 2019

C целые числа импортируются в Swift как Int32, и их нельзя сравнивать с дополнительным Int? напрямую.Помогает преобразование:

if ((error as NSError?)?.code == Int(someStrangeError_Code)) {
    // some strange error
}

В качестве альтернативы сначала разверните необязательную ошибку:

if let error = error {
    if (error as NSError).code == someStrangeError_Code {
        // some strange error
    } else {
        // some other error
    }
} else {
    // no error
}

Еще один вариант - изменить определение (Objective-) C на

#define someStrangeError_Code   1000L

для константы long int, которая импортируется в Swift как Int.Тогда ваш оригинальный код Swift будет скомпилирован снова.

...