NS_REFINED_FOR_SWIFT и возвращаемое значение
Я новичок в Swift, и я начинаю изучать некоторые возможности для соединения с Objective-C.
В настоящее время у меня есть метод с NSError
ссылка, которая является:
- (BOOL) verifyPersonalizationWithError:(NSError **) error NS_REFINED_FOR_SWIFT;
Теперь я могу получить доступ к методу в Swift для некоторых уточнений, но возвращаемое значение потеряно. Сгенерированный метод для Swift:
open func __verifyPersonalization() throws
Ошибка корректно обрабатывается с помощью do catch, но возвращаемое значение, похоже, потеряно.
Что-нибудь пропущено для моего макроса NS_REFINED_FOR_SWIFT?
1 ответ
Это не связано с NS_REFINED_FOR_SWIFT
макро. Метод Objective-C
- (BOOL) verifyPersonalizationWithError:(NSError **) error;
импортируется в Swift как
open func verifyPersonalization() throws
и единственный эффект от NS_REFINED_FOR_SWIFT
макрос предназначен для добавления подчеркивания к имени метода Swift
open func __verifyPersonalization() throws
который позволяет предоставлять улучшенный интерфейс Swift в расширении, при этом сохраняя исходную реализацию доступной для вызова из усовершенствованного интерфейса (см. "Уточнение объявлений Objective-C" в Swift и Objective-C в том же проекте).
Импортер Swift предполагает, что логическое возвращаемое значение метода Objective-C указывает на успех или неудачу, что является общим шаблоном Какао, как описано в разделе Использование и создание объектов ошибок:
Важное замечание: Успех или неудача указывается возвращаемым значением метода. Хотя методы Какао, которые косвенно возвращают объекты ошибок в домене ошибок Какао, гарантированно возвращают такие объекты, если метод указывает на сбой, напрямую возвращая ноль или НЕТ, вы всегда должны проверять, чтобы возвращаемое значение было ноль или НЕТ, прежде чем пытаться что-либо делать с NSError объект.
Типичное использование в Objective-C
NSError *error;
if ([self verifyPersonalizationWithError:&error]) {
NSLog(@"success");
} else {
NSLog(@"failed: %@", error.localizedDescription);
}
Метод Swift выдает ошибку при сбое, поэтому нет необходимости возвращать логическое возвращаемое значение:
do {
try verifyPersonalization()
print("success")
} catch {
print("failed:", error.localizedDescription)
}
Если метод Objective C действительно указывает на ошибку, оставляя ненулевую ошибку в параметре error (вместо возврата false
(это обычный шаблон Какао), то вы можете указать это, добавив атрибут:
- (BOOL) verifyPersonalizationWithError:(NSError **) error
__attribute__((swift_error(nonnull_error)));
который импортируется в Swift как
open func verifyPersonalization() throws -> Bool
swift_error
атрибут задокументирован по адресу https://github.com/apple/swift-clang/blob/383859a9c4b964af3d127b5cc8abd0a8f11dd164/include/clang/Basic/AttrDocs.td#L1800-L1819