Swift 2.0 与 Objective C 的互操作没有按预期工作?
Swift 2.0 interop with Objective C not working as expected?
我正在将 Swift 1.2 框架移植到 2.0。在修复了新的 Swift 2.0 错误处理方案带来的 300 万个编译器错误之后,我终于能够 link 我的测试应用程序(用 Objective C 编写)使用更新后的框架。
Xcode 版本 7.0 beta 3 (7A121l)
但是,我运行遇到了问题。某些 Swift 函数不再生成到 Objective C 测试应用程序使用的自动生成的 Objective C header (MyFramework-Swift.h) 中。
下面是一个未公开的函数示例:(我的实际框架函数 return 是一个枚举,但我试图简化以更清楚地说明问题)。
public func calculateImportantValueDangerously() throws -> Int
{
return 42
}
请注意,像下面这样的其他函数实际上会按预期公开(并且可以调用):
public func doSomething()
{
}
public func doSomethingDangerous() throws
{
}
public func calculateMeaninglessValue() -> Int
{
return -1
}
这是 Objective 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);
从观看这个视频开始,我预计它应该 "just work":
https://developer.apple.com/videos/wwdc/2015/?id=401
...但似乎我们目前不能使用既抛出又 return 一个值的函数。
这是错误还是未实现的功能?如果我遗漏了发行说明中的某些内容,我深表歉意。
感谢任何建议。
不可能。
如果你用 @objc
注释你的方法,你就会看到问题。
Throwing method cannot be marked @objc because it returns a value of
type 'Int'; return 'Void' or a type that bridges to an Objective-C
class
您只能return对象,不支持原语。
虽然选择的答案是正确的;你不能 return Int 用于抛出函数,我想指出一个替代解决方案,因为 Apple 对 CoreData 框架中的函数有同样的问题:
func countForFetchRequest(request: NSFetchRequest, error: NSErrorPointer) -> Int
请注意,在这种情况下,Apple 没有使用抛出模式,而是恢复到经典的 NSError out 参数机制。
我正在将 Swift 1.2 框架移植到 2.0。在修复了新的 Swift 2.0 错误处理方案带来的 300 万个编译器错误之后,我终于能够 link 我的测试应用程序(用 Objective C 编写)使用更新后的框架。
Xcode 版本 7.0 beta 3 (7A121l)
但是,我运行遇到了问题。某些 Swift 函数不再生成到 Objective C 测试应用程序使用的自动生成的 Objective C header (MyFramework-Swift.h) 中。
下面是一个未公开的函数示例:(我的实际框架函数 return 是一个枚举,但我试图简化以更清楚地说明问题)。
public func calculateImportantValueDangerously() throws -> Int
{
return 42
}
请注意,像下面这样的其他函数实际上会按预期公开(并且可以调用):
public func doSomething()
{
}
public func doSomethingDangerous() throws
{
}
public func calculateMeaninglessValue() -> Int
{
return -1
}
这是 Objective 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);
从观看这个视频开始,我预计它应该 "just work":
https://developer.apple.com/videos/wwdc/2015/?id=401
...但似乎我们目前不能使用既抛出又 return 一个值的函数。
这是错误还是未实现的功能?如果我遗漏了发行说明中的某些内容,我深表歉意。
感谢任何建议。
不可能。
如果你用 @objc
注释你的方法,你就会看到问题。
Throwing method cannot be marked @objc because it returns a value of type 'Int'; return 'Void' or a type that bridges to an Objective-C class
您只能return对象,不支持原语。
虽然选择的答案是正确的;你不能 return Int 用于抛出函数,我想指出一个替代解决方案,因为 Apple 对 CoreData 框架中的函数有同样的问题:
func countForFetchRequest(request: NSFetchRequest, error: NSErrorPointer) -> Int
请注意,在这种情况下,Apple 没有使用抛出模式,而是恢复到经典的 NSError out 参数机制。