【问题标题】:Can I expose Swift default parameter values to Objective-C?我可以向 Objective-C 公开 Swift 默认参数值吗?
【发布时间】:2016-02-03 18:46:28
【问题描述】:

假设我有一些 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 函数(即它们是隐藏 typical implementation 我们的语法糖'会在 Obj-C 中使用)。

有没有办法将这个默认值暴露给 Objective-C?如果没有,任何人都可以向我指出为什么这不可用的任何文档吗?

【问题讨论】:

  • 我怀疑你会得到比“Apple 太忙而无法处理它”更好的理由。在去年的 WWDC 上,所有的谈话都是关于 Swift 的。 ObjC 仅获得 2 个新功能:可空性标记和泛型

标签: objective-c swift


【解决方案1】:

答案是否定的,目前没有办法公开。

不过,它正在考虑用于 Swift 3.0(请参阅提案 here

编辑:正如 Adam S 所指出的那样,这是不正确的。

【讨论】:

  • 从我在该提案中读到的内容,它正在考虑在公开 Obj-C API 时使用 Swift 默认参数,从而允许您跳过在从 Swift 调用 Obj-C API 时容易默认的事情 。这很好,但是我正在寻找另一个方向 - 除非我误读或忽略了那里的某些东西。
  • This is the section I'm referring to 描述了您可以对 Swift 代码进行的更改以利用该潜在功能。
  • @AdamS 你说的很对。我浏览了邮件列表中的标题并做出了假设(我应该考虑到该提案的标题)
  • 那又怎样……这还不可能吗?
猜你喜欢
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2011-04-18
  • 2014-04-28
  • 2023-03-16
  • 2012-09-13
相关资源
最近更新 更多