将 Swift 3 升级到 4,目标 c 中不再有 swift 扩展

Posted

技术标签:

【中文标题】将 Swift 3 升级到 4,目标 c 中不再有 swift 扩展【英文标题】:Upgrading Swift 3 to 4, swift extension no longer in objective c 【发布时间】:2017-09-20 12:58:04 【问题描述】:

我刚刚将一个混合语言项目(objective-c 和 Swift)从 Swift 3 升级到 Swift 4。

一切似乎都很顺利,除了我的所有 Swift 扩展在 Objective-c 中不再可用。我不知道如何让 any Swift 扩展出现在 Objective-c 中。我试过搜索,但除了放宽 private 范围外,我找不到任何提及 Swift 4 中扩展的更改。

所有这些扩展都可以从 Swift 3 中的 Objective-c 访问,因此没有不兼容的类型(结构或非原始枚举)。 这些扩展被标记为公开。 这些扩展与 Objective-c 文件属于同一目标和同一项目中。 是的,我已经在相关的objective-c文件中导入了“ProjectName-Swift.h”。 其他兼容的 Swift 类 出现。似乎只是缺少扩展。 我也尝试将每个func 标记为公共。

例如,当我使用 Swift 3 时,以下扩展曾经可用于 Objective-c 代码:

public extension UIAlertController 

  class func alert(_ title: String? = nil, message: String? = nil) -> UIAlertController 
    return UIAlertController(title: title, message: message, preferredStyle: .alert)
  

  @discardableResult func action(_ action: String) -> UIAlertController 
    self.addAction(UIAlertAction(title: action, style: .default, handler: nil))
    return self
  

  @discardableResult func action(_ action: String, style: UIAlertActionStyle = .default, onSelected: ((UIAlertAction) -> Void)? = nil) -> UIAlertController 
    self.addAction(UIAlertAction(title: action, style: style, handler: onSelected))
    return self
  

  @discardableResult func cancel(_ action: String? = "Cancel", onCancel: ((UIAlertAction) -> Void)? = nil) -> UIAlertController 
    self.addAction(UIAlertAction(title: action, style: .cancel, handler:  alert in
      onCancel?(alert)
    ))
    return self
  

  @discardableResult func destructive(_ action: String, onDestruct: @escaping ((UIAlertAction) -> Void)) -> UIAlertController 
    self.addAction(UIAlertAction(title: action, style: .destructive, handler:  action in
      onDestruct(action)
    ))
    return self
  

  func presentOn(_ viewController: UIViewController, animated: Bool = true) 
    viewController.present(self, animated: animated, completion: nil)
  

【问题讨论】:

您可能必须将@objc 添加到所有方法中。 或者只是扩展声明本身,例如@objc public extension(比较***.com/q/44390378/2976878) 啊,是的……就是这样。我想这与他们所做的@objc 推理更改有关。 任何人都想将其添加为答案,我会接受。 【参考方案1】:

一个超级简单的解决方案是在每个 Swift 扩展的声明中添加 @objc public extension

【讨论】:

以上是关于将 Swift 3 升级到 4,目标 c 中不再有 swift 扩展的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 10, Swift 4.2及iOS 12升级适配

目标 C:[MyObject alloc] 现在在 iOS SDK 4.1 下崩溃

为啥升级到 Symfony 4.4 后我不再看到错误预览页面?

:[已解决]:将 gradle 升级到 4.0.0 后,改造不再收到响应

如何将 NSData 参数传递给在 swift 3 中调用的目标 c 方法?

升级到 .NET 4.5 和 EF5。不再能够部署 WCF 服务。