Взаимодействие 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.