在 Swift 中使用 Objective-C 类别的正确方法是啥?

Posted

技术标签:

【中文标题】在 Swift 中使用 Objective-C 类别的正确方法是啥?【英文标题】:What's the proper way to use an Objective-C category within Swift?在 Swift 中使用 Objective-C 类别的正确方法是什么? 【发布时间】:2014-06-05 15:46:36 【问题描述】:

我正在尝试将一些类别方法导入到我的 Swift 文件中,但没有成功。

ios-Bridging-Header.h:

#import "UIColor+Hex.h"

UIColor+Hex.h

#import <UIKit/UIKit.h>

@interface UIColor (Hex)

+ (UIColor *)colorWithHex:(NSUInteger)hexInt;
+ (UIColor *)colorWithHexString:(NSString *)hexString;

@end

我希望自动完成功能会显示 UIColor(hexInt: NSUInteger)UIColor(hexString: String)

【问题讨论】:

developer.apple.com/library/prerelease/ios/documentation/swift/… 我有几个关于您的代码的问题:在您的桥接头中,它不应该是“#import”而不是“import”吗?你写了哪一行来最终在 Swift 中导入你的类别? 是的,我的问题中有错字。我在下面接受的代码对我来说效果很好! 在下面查看我的新答案。基本上你需要一个桥接头:developer.apple.com/library/ios/documentation/Swift/Conceptual/… 我正在尝试使用 NSAttributedString 扩展名(cocopods),我已将它们添加到桥接头文件中,但与您的问题相同。我希望自动完成功能可以显示方法,但事实并非如此。我使用的 Pod 来自:github.com/dbowen/NSAttributedString-DDhtml 谢谢, 【参考方案1】:

实际上,您的类别被翻译成 Swift 如下:

extension UIColor 

    init(hex hexInt: Int) -> UIColor

    init(hexString: String) -> UIColor


因此,您应该使用:

let color = UIColor(hex: 0xffffff) // instead of hexInt:

let color = UIColor(hexString: "ffffff")

不过,Beta 版软件中的自动补全功能可能仍然存在问题。

【讨论】:

3 年后...自动补全仍然有问题。【参考方案2】:

您可以直接在 Swift 中使用 Objective-C 类别。这对于一些桥接类(如 String)来说非常有趣。用 Objective-C 中的类别扩展 NSString,然后你可以从 Swift 中访问它(直接在 String 上!)

这样做的方法是在您的 Swift 项目中创建一个“桥接头”。

完整说明here。

简称:

    制作一个包含所有其他#import 语句的.h 头文件(在Objective-C 中) 将该文件的路径放在构建设置中的Objective-C Bridging Header 中 无需在 Swift 文件中导入桥接头。它已经在那里了

【讨论】:

但问题是这个类别将在所有 swift 文件中可用,但是在 ObjC 中我们可以在实际需要的文件中使用 @MayankJain 更重要的是,在 Objective-C 中,您可以在具有相似方法名称的不同类别之间进行选择。然而,这可能是一个很好的方式来让自己在脚下开枪......也许 Swift 它最终在这件事的右侧。 @DanRosenstark 同意...!!!在我的一个项目中,我要求在特定文件中导入类别文件,我希望其他文件应该使用原始实现,并且只有特定文件才能使用自定义类别。类别是用 ObjC 编写的。

以上是关于在 Swift 中使用 Objective-C 类别的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Objective-C 中使用 Swift 类

在 Objective-C 中使用通用 Swift 类

在 Objective-c 中使用 swift 类

无法在 Swift 中扩展 Objective-C 类

在objective-c中使用swift代码时的问题

无法在框架项目的 Objective-C 代码中导入 Swift 类