Swift Tips - NS_REFINED_FOR_SWIF

作者: eaa1d39d22a8 | 来源:发表于2016-01-11 23:24 被阅读657次

    如果您的项目中使用了 Objective-C 以及 Swift 两种语言混编,您可能会遇到这样一个尴尬的局面:Objective-C 的 API 和 Swift 的风格相差比较大,Swift调用Objective-C的API时可能由于数据类型等不一致导致无法达到预期(比如,Objective-C里的方法采用了C语言风格的多参数类型;或者Objective-C方法返回NSNotFound,在Swift中期望返回nil)。这时候就要 NS_REFINED_FOR_SWIFT了。

    NS_REFINED_FOR_SWIFT宏指令是Xcode 7.0 新出的参考Xcode 7.0 release note,用它所标记的方法和变量在Objective-C中可以正常使用,但bridge到Swift语言时,编译器会在名称前加上__注意是双下划线
    直接上代码更易懂:
    如下,我们定义了Objective-C风格的API:

    @interface MyClass : NSObject
    
    // return:返回aString的索引,如果未找到的话则返回 NSNotFound 
    // 注:NSNotFound在Objective-C中定义为NSIntegerMax,我们在期望此方法在Swift中调用能返回nil
    - (NSUInteger)indexOfString:(NSString *)aString NS_REFINED_FOR_SWIFT; 
    
    @end
    

    当桥接到 Swift 的时候,这个方法变为:

    public class MyClass: NSObject
    {
       public func __indexOfString(aString: String!) -> UInt
    }
    

    通过 Objective-C 方法,您就可以使用相同的名称来提供一个对 Swift 更友好的 API,我们期望该方法返回可空类型来符合Swift的编码规范,如下所示。

    extension MyClass
    {
    // return: 返回aStirng的索引,如果未找到的话返回nil  
    func indexOfString(aStirng: String!) -> Int? {        
       let index = Int(__indexOfString(aStirng)) 
       if (idx == NSNotFound) { 
           return nil 
       }        
       return index
    }
    

    更多参考链接:
    Swift 小贴士:语言的扩展和自定义

    相关文章

      网友评论

      本文标题:Swift Tips - NS_REFINED_FOR_SWIF

      本文链接:https://www.haomeiwen.com/subject/kgaqkttx.html