如何在 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)
确保您还应该将类别文件添加到“以上是关于如何在 Swift 中调用 Objective-C 类别方法的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Swift 调用 Objective-C 类的工厂方法?
如何在 Swift 中转换 Objective-C TOCropViewController 委托方法?
无法在 Objective-C .m 文件中调用 Swift 方法
如何从具有隐藏变量名称(参数前的_)或内部+外部(例如 foo(with bar:))的 Objective-C 调用 Swift 函数