如何在 Swift 中调用 Objective-C 类别方法

Posted

技术标签:

【中文标题】如何在 Swift 中调用 Objective-C 类别方法【英文标题】:How to call an Objective-C category method in Swift 【发布时间】:2014-06-03 02:36:09 【问题描述】:

你会如何在 Swift 中调用这样的 Objective-C 类别方法?

+(UIColor*)colorWithHexString:(NSString*)hex alpha:(float)alpha;

【问题讨论】:

Class.colorWithHexString("#ffffff", 1) 那个方法一定是属于某个类别的吧?我在网上找不到对它的引用。 我相信是Class.colorWithHexString("#ffffff", alpha:1)。我不知道命名参数是可选的还是必需的,但即使它是可选的,我也更喜欢它。 (某种程度上)命名参数是使 Objective-C 比 C 更好的一件事,现在看来 Swift 有真正的命名参数,所以我鼓励利用它们。 @***foe 它不必是一个类别,它可以是任何类的类方法。 @***foe 是的。虽然,我认为它会是一样的。当这是一个我在 Apple 提供的电子书中找不到的合法问题时,我不确定为什么这会被否决。 【参考方案1】:

编译器会自动查找常见的 ObjC 命名模式并用 Swift 模式替换它们。一个返回类实例的 ObjC 类方法(并以某种方式命名,看起来像)被转换为 Swift 便利初始化程序。

如果你有 ObjC 方法(由自定义类别定义):

 + (UIColor *)colorWithHexString:(NSString *)hex alpha:(float)alpha;

编译器生成 Swift 声明:

convenience init(hexString: String?, alpha: CFloat)

你这样称呼它:

let color = UIColor(hexString: "#ffffff", alpha: 1.0)

在 Swift 2.0 或更高版本中,您可以使用 NS_SWIFT_NAME 宏将与命名模式不匹配的 ObjC 工厂方法导入 Swift 作为初始化程序。例如:

@interface UIColor(Hex)
+ (UIColor *)hexColorWithString:(NSString *)string
NS_SWIFT_NAME(init(hexString:));
@end

// imports as
extension UIColor 
    init(hexString: String)

【讨论】:

只是为了完整的变体列表:如果你在 Obj-c 中有类似 + (AAPLAPI *)registerAcctount:(NSString*)username password:(NSString *)password; 的东西并想从 Swift 中调用它,调用将如下所示:AAPLAPI.registerAccount(usernameTextField?.text, password: passwordTextField?.text) 确保您还应该将类别文件添加到“-Bridging-Header.h”。在另一种情况下,swift 代码看不到您的类别。

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

如何从 Swift 调用 Objective-C 类的工厂方法?

如何在 Swift 中转换 Objective-C TOCropViewController 委托方法?

无法在 Objective-C .m 文件中调用 Swift 方法

如何从具有隐藏变量名称(参数前的_)或内部+外部(例如 foo(with bar:))的 Objective-C 调用 Swift 函数

从objective-c++调用swift函数

在swift文件中调用objective-C属性块,完成块属性变为零