我能否将Swift的默认参数值暴露给Objective-C?

21

假设我有一些Swift类,其中包含我想要暴露给Objective-C的方法:

@objc(Worker) class Worker : NSObject {
    func performWork(label: String = "Regular Work") {
        // Perform work
    }
}
我可以用两种方法调用它:

我可以用两种方法调用它:

Worker().performWork()
Worker().performWork("Swift Development")

然而,当从Objective-C中调用时,我无法获得该方法的“默认”版本 - 我必须提供一个标签:

[[[Worker alloc] init] performWork:@"Obj-C Development"];

请见下面我的AppName-Swift.h头文件中的定义:

SWIFT_CLASS_NAMED("Worker")
@interface Worker : NSObject
- (void)performWork:(NSString * __nonnull)label;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

我会期望看到一个带有这个签名的方法:

- (void)performWork;

我意识到ObjC不支持默认参数值,但我的假设是Swift默认值只是生成额外的Swift函数,其具有调用“真实”函数的微不足道的实现(即它们是语法糖,隐藏了我们在Obj-C中使用的典型实现方式)。

是否有办法将此默认值暴露给Objective-C?如果没有,有人能指向任何关于为什么不可用的文档吗?


1
我怀疑你不会得到比“苹果太忙了”更好的理由。去年的WWDC上,所有的讲座都是关于Swift的。ObjC只有两个新功能:nullability markers和generics。 - Code Different
1个回答

6
答案是否定的,目前没有公开的方法来实现这个。然而,Swift 3.0正在考虑这个问题(请参见提议here)。
编辑:正如Adam S.指出的那样,上述内容是不正确的。

1
从我在那份提案中所读到的内容来看,它正在考虑在暴露 Obj-C API 时利用 Swift 默认参数,使您能够在从 Swift 调用 Obj-C API 时跳过一些可以轻松默认的内容。这很棒,但是我正在寻找另一个方向——除非我误读或忽略了某些内容。 - Adam S
这是我所指的部分,它描述了您可以对Swift代码进行的更改,以利用该潜在功能。请参见:https://github.com/apple/swift-evolution/blob/master/proposals/0005-objective-c-name-translation.md#add-default-arguments - Adam S
@AdamS 你说得很对。我只是匆匆浏览了邮件列表中的标题,并做出了一些假设(我应该考虑到那个提案的标题)。 - ssrobbi
3
那么...这现在还不可能吗? - Renetik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接