在 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 类别的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章