【问题标题】:Swift 2.0 interop with Objective C not working as expected?Swift 2.0 与 Objective C 的互操作没有按预期工作?
【发布时间】:2015-07-14 20:32:15
【问题描述】:

我正在将 Swift 1.2 框架移植到 2.0。在通过新的 Swift 2.0 错误处理方案修复了 300 万个编译器错误后,我终于能够链接我的测试应用程序(用 Objective C 编写)以使用更新的框架。

Xcode 版本 7.0 beta 3 (7A121l)

但是,我遇到了一个问题。一些 Swift 函数不再生成到 Objective C 测试应用程序使用的自动生成的 Objective C 头文件 (MyFramework-Swift.h) 中。

下面是一个未公开的函数示例:(我的实际框架函数返回一个枚举,但我尝试简化以更清楚地说明问题)。

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);  

通过观看此视频,我原以为它应该“正常工作”:

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

...但我们目前似乎不能使用既抛出又返回值的函数。

这是一个错误,还是未实现的功能?如果我在某处遗漏了发行说明中的​​某些内容,我深表歉意。

任何建议表示赞赏。

【问题讨论】:

    标签: objective-c swift swift2 xcode7 xcode7-beta3


    【解决方案1】:

    这是不可能的。

    如果您使用@objc 注释您的方法,您将看到问题。

    抛出的方法不能被标记为@objc,因为它返回的值是 输入“国际”;返回 '​​Void' 或桥接到 Objective-C 的类型 类

    您只能返回对象,不支持原语。

    【讨论】:

    • 啊我应该更清楚 - 将更新问题。我实际上查看了生成的 MyFramework-Swift.h。函数没有以calculateImportantValueDangerouslyAndReturnError的形式存在
    • 哇。好一个。我的框架类继承自 NSObject,但我想这还不足以产生有意义的错误消息。使用@objc 标记函数暴露了编译错误。仍然认为这种糟糕。
    【解决方案2】:

    虽然选择的答案是正确的;您不能为抛出函数返回 Int,我想指出一个替代解决方案,因为 Apple 在 CoreData 框架中的函数存在同样的问题:

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

    请注意,在这种情况下,Apple 没有使用 throws 模式,而是恢复到经典的 NSError out 参数机制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多