首页 文章

NS_SWIFT_NAME是否保留为Factory方法?

提问于
浏览
3

我正在开发一个用Objective-C编写的库,我希望在Swift上桥接时尽可能使它成为“Swifty” .

例如,具有此定义的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:) )

然后迅速翻译成

func logProduct(identifier productId: String, name productName: String)

我看到SO questions提到 NS_SWIFT_NAME 仅适用于工厂方法 . Apple documentation仅提及工厂方法作为示例,但没有明确说明对 NS_SWIFT_NAME 的限制

1 回答

  • 5

    据我所知,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友好 . 请不要忘记放置可空性属性 .

相关问题