我正在开发一个用 Objective-C 编写的库,我希望它在 Swift 上桥接时尽可能“敏捷”。
例如,具有此定义的 Objective-C 方法
-(void)logProductWithId:(NSString *) productId productName:(NSString*) productName;
自动翻译成这个 Swift 函数
func logProductWithId(productId: String, productName: String)
使用 NS_SWIFT_NAME
宏去掉“With”是个好习惯吗:
-(void)logProductWithId:(NSString *) productId productName:(NSString*) productName NS_SWIFT_NAME( logProduct(identifier:name:) )
然后 swift 翻译成
func logProduct(identifier productId: String, name productName: String)
我看到一些 SO questions提到 NS_SWIFT_NAME
仅适用于工厂方法。 Apple documentation仅提及工厂方法作为示例,但未明确说明对 NS_SWIFT_NAME
最佳答案
据我所知,Apple 的文档中没有明确的限制。 让我们尝试一下。
包含此代码的示例项目:
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
-(void)logProductWithId:(NSString *) productId productName:(NSString*) productName NS_SWIFT_NAME( logProduct(identifier:name:) );
@end
编译成功,可以看到生成的界面如下:
import Foundation
open class MyClass : NSObject {
open func logProduct(identifier productId: String!, name productName: String!)
}
没问题。也许你需要一些其他条件来得到“只有工厂方法可以有'swift_name'属性”错误,我还没有透露。
似乎 NS_SWIFT_NAME
不仅仅为工厂方法保留。更好地使用它来使您的 Objective-C 代码对 Swift 更加友好。请不要忘记添加可空性属性。
关于objective-c - NS_SWIFT_NAME 是否保留给工厂方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39229457/