objective-c - NS_SWIFT_NAME 是否保留给工厂方法?

标签 objective-c swift

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

相关文章:

swift - 定义在闭包中使用的泛型类型

ios - KeychainWrapper 保存数据并在同一函数中检索数据不起作用

ios - ViewDidLoad 中的 8 个 ViewController 或 1 个 ViewController 和 Adjust 按钮更优化

objective-c - Apple Mach-O 链接器错误 lxml

IOS 在 subview 中绘制文本

iOS - 如何推送到 View Controller 并在返回时保持正确的 "View Stack"

ios - 当您知道没有保存实体时如何处理 CoreData 中的获取请求

iphone - 从 UIPageViewController 卸载 viewController

ios - 如果我有一个 UITableViewController 类,我应该在哪里初始化它的实例变量?

ios - 在不调用 cellForRowAtIndexPath 的情况下重绘表格 View 单元格