将 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 中扩展的更改。
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 后,改造不再收到响应