我正在开发一个用Objective-C编写的库,我希望在Swift上桥接时尽可能使它成为"Swifty".
例如,具有此定义的Objective-C方法
-(void)logProductWithId:(NSString *) productId productName:(NSString*) productName;
Run Code Online (Sandbox Code Playgroud)
自动转换为此Swift函数
func logProductWithId(productId: String, productName: String)
Run Code Online (Sandbox Code Playgroud)
使用NS_SWIFT_NAME宏来摆脱"With" 是一个好习惯:
-(void)logProductWithId:(NSString *) productId productName:(NSString*) productName NS_SWIFT_NAME( logProduct(identifier:name:) )
Run Code Online (Sandbox Code Playgroud)
然后迅速翻译成
func logProduct(identifier productId: String, name productName: String)
Run Code Online (Sandbox Code Playgroud)
我看到一些做题提的是,NS_SWIFT_NAME仅适用于工厂方法.在苹果公司的文件仅提到了工厂方法作为例子,但没有明确说,关于限制上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
Run Code Online (Sandbox Code Playgroud)
编译成功,您可以将其生成的界面视为:
import Foundation
open class MyClass : NSObject {
open func logProduct(identifier productId: String!, name productName: String!)
}
Run Code Online (Sandbox Code Playgroud)
没问题.也许你需要一些其他条件来获得"只有工厂方法可以有'swift_name'属性"错误,我还没有透露.
似乎NS_SWIFT_NAME不仅仅为工厂方法保留.并且更好地使用它来使您的Objective-C代码更加Swift友好.请不要忘记放置可空性属性.
| 归档时间: |
|
| 查看次数: |
3127 次 |
| 最近记录: |