Взаимодействие Swift 2.0 с Objective C не работает, как ожидалось?

Я портирую фреймворк Swift 1.2 на 2.0. После исправления 3 миллионов ошибок компилятора благодаря новой схеме обработки ошибок Swift 2.0 я наконец смог связать свое тестовое приложение (написанное в Objective C), чтобы использовать обновленную среду.

Xcode version 7.0 beta 3 (7A121l)

Однако я столкнулся с проблемой. Некоторые функции Swift больше не генерируются в автоматически сгенерированном заголовке Objective C (MyFramework-Swift.h), используемом тестовым приложением Objective C.

Вот пример функции, которая не отображается: (Моя фактическая каркасная функция возвратила перечисление, но я попытался упростить, чтобы проиллюстрировать проблему более четко).

public func calculateImportantValueDangerously() throws -> Int  
{  
    return 42  
}  

Обратите внимание, что другие функции, подобные приведенным ниже, на самом деле отображаются должным образом (и могут вызываться):

public func doSomething()  
{  
}  

public func doSomethingDangerous() throws  
{  
}  

public func calculateMeaninglessValue() -> Int  
{  
    return -1  
}  

Вот объективная сторона C:

MyClass *newInstance = [[MyClass alloc] init];  
[newInstance doSomething];  

NSError *error = nil;  
[newInstance doSomethingDangerousAndReturnError:&error];  

long meaninglessValue = [newInstance calculateMeaninglessValue];  
NSLog(@"%ld", meaninglessValue);  

long importantValue = [newInstance calculateImportantValueDangerouslyAndReturnError:&error]; <-COMPILE ERROR
NSLog(@"%ld", importantValue);  

Смотря это видео, я ожидал, что оно должно "просто работать":

https://developer.apple.com/videos/wwdc/2015/?id=401

... но похоже, что в настоящее время мы не можем использовать функции, которые одновременно генерируют и возвращают значение.

Это ошибка или не реализованная функция? Мои извинения, если я что-то пропустил в примечаниях к выпуску.

Любой совет приветствуется.

2 ответа

Решение

Это невозможно.

Если вы аннотируете свой метод с @objc вы увидите проблему.

Метод броска не может быть помечен как @objc, потому что он возвращает значение типа 'Int'; вернуть 'Void' или тип, который соединяется с классом Objective-C

Вы можете вернуть только объекты, примитивы не поддерживаются.

Хотя выбранный ответ правильный; вы не можете вернуть Int для функции выброса, я хотел бы отметить альтернативное решение, поскольку у Apple есть такая же проблема для функции в платформе CoreData:

func countForFetchRequest(request: NSFetchRequest, error: NSErrorPointer) -> Int

Обратите внимание, что в этом случае Apple не использует шаблон throws, а вместо этого возвращается к классическому механизму параметра NSError out.

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