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

Другие вопросы по тегам