如何在Swift中正确使用Objective-C类别?

22

我试图将一些类别方法导入到我的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)


https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Extensions.html - holex
我有几个关于你的代码的问题:在你的桥接头文件中,应该使用"#import"而不是"import",对吗?你最终用哪一行导入了你的Swift类别? - Captain Fim
是的,我的问题中有个打字错误。我接受下面的代码对我很有效! - sevenflow
请看下面我的新回答。基本上你需要一个桥接头文件:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html - Dan Rosenstark
我正在尝试使用NSAttributedString扩展(cocoapods),我已经在桥接头文件中添加了它们,但是遇到了与你一样的问题。我期望自动完成可以显示方法,但是没有显示。我使用的Pods来自:https://github.com/dbowen/NSAttributedString-DDHTML 谢谢。 - Fayza Nawaz
2个回答

35

实际上,您的类别在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版软件中,自动补全功能可能仍存在错误。


4
三年后...自动完成仍然存在缺陷。 - Dermot

25
你可以直接在Swift中使用Objective-C类别。对于一些桥接的类(如String),这变得非常有趣。在Objective-C中扩展NSString类别,然后你就可以从Swift中访问它(直接在String上)!
创建一个“桥接头文件”是实现这一点的方法。
具体步骤 请参见此处
简要说明如下:
  1. 在Objective-C中创建一个.h头文件,并在其中包含所有其他的#import语句。
  2. 将该文件的路径放入Build Settings中的Objective-C Bridging Header。
  3. 不需要在Swift文件中导入桥接头文件,因为它已经存在。

但问题是这个类别将在所有Swift文件中可用,然而在ObjC中,我们可以在实际需要它的文件中使用。 - Mayank Jain
1
@MayankJain 更重要的是,在Objective-C中,您可以选择具有类似方法名称的不同类别。然而,这可能是自讨苦吃的好方法...也许Swift最终处于正确的一面。 - Dan Rosenstark
@DanRosenstark 同意...!!! 在我的一个项目中,我需要在特定文件中导入类别文件,我希望其他文件使用原始实现,只有特定文件可以使用自定义类别。类别是用ObjC编写的。 - Mayank Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接