NS_SWIFT_NAME是保留给工厂方法吗?

5

我正在开发一个用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:) )

然后在Swift中进行翻译:

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

我看到一些Stack Overflow的问题提到NS_SWIFT_NAME只适用于工厂方法。Apple文档仅举了工厂方法作为示例,但没有明确说明NS_SWIFT_NAME的限制。


根据下面的文档,NS_SWIFT_NAME 不仅限于工厂方法。https://developer.apple.com/documentation/swift/objective-c_and_c_code_customization/renaming_objective-c_apis_for_swift - aios
1个回答

10

据我查找,苹果公司的文档中并没有明确的限制。那就让我们试试吧。

这段代码包含在一个示例项目中:

#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代码更加友好。同时,请不要忘记添加nullability属性。


是的,我有 nullability 属性。我刚试图在 XCode 6 上编译,但该宏根本未定义,因此我添加了一个兼容性,在其中将其定义为 #define NS_SWIFT_NAME(_) - Jan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接