如何在Swift中调用Objective-C的NSMeasurement分类方法?
在Swift中调用NSMeasurement OC分类的foo方法
嘿,我之前也碰到过OC分类在Swift值类型桥接里调用的问题,给你一步步说清楚怎么解决:
1. 给OC分类方法添加Swift映射宏
首先,你需要修改你的OC分类头文件NSMeasurement+Test.h,给foo方法加上NS_SWIFT_NAME宏,明确告诉Swift这个方法的映射名称:
@interface NSMeasurement (Test) - (NSString *)foo NS_SWIFT_NAME(foo()); @end
这个宏是关键,能让Swift正确识别到OC分类里的方法。
2. 在Swift中转换类型并调用方法
因为Swift里NSMeasurement被桥接成了值类型Measurement结构体,而OC分类的方法是给引用类型NSMeasurement类添加的,所以你需要先把Swift的Measurement转换成OC的NSMeasurement实例,再调用方法:
// 先创建一个Swift的Measurement实例 let myMeasurement = Measurement(value: 5.0, unit: UnitMass.kilograms) // 转换成OC的NSMeasurement,然后调用foo方法 if let ocMeasurement = myMeasurement as NSMeasurement? { let fooResult = ocMeasurement.foo() print("调用foo方法得到:\(fooResult)") }
3. 可选优化:给Swift的Measurement写扩展包装
如果不想每次都手动转换,你可以给Swift的Measurement写个扩展,把这个方法包装起来,这样调用更方便:
extension Measurement { func foo() -> String { // 强制转换,因为桥接是双向安全的 return (self as NSMeasurement).foo() } } // 现在直接调用就行 let result = myMeasurement.foo()
原理其实很简单:Swift的Measurement和OC的NSMeasurement是双向桥接的,但OC分类的方法不会自动被Swift的结构体继承,所以必须通过类型转换拿到OC实例,才能调用分类里的方法。
内容的提问来源于stack exchange,提问作者Paul Reznik
相关产品推荐
相关产品推荐

