• Swift 类型桥接


    前言

    • iOS 中的 API 基本都是在许多年前由 OC 写成的,现在通过桥接的方法在 Swift 中可以用,基本看不出区别,非常自然。但是一些特殊的类型,在两种语言进行桥接的时候需要特别注意。

    1、NSString 类型

    • NSString 是 Swift 中 String 类型在 OC 中的形式。

    • 1)Swift 1.2

      • 弱化了 StringNSString 类型的桥接,这为在 Swift 中调用 OC 代码制造了一定的困难,因为大量的 OC 方法都存在 NSString 类型的参数。
    • 2)Swift 2.0

      • StringNSString 又能亲密无间的互相传递了。
    • 3)Swift 2.2

      • 可以无缝的使用这两种类型,在需要传入 NSString 类型的地方可以直接传入 String

        func someMethod(nsstr: NSString) {
            print(nsstr)
        }
        
        let str: String = "abc"
        someMethod(nsstr: str)
        
      • 由于 String 是比 NSString 更高级的类型,在需要传入 String 的场合不能直接传入一个 NSString,需要借助 as 转换类型。

        func someMethod(str: String) {
            print(str)
        }
        
        let nsstr: NSString = "abc"
        someMethod(str: nsstr as String)
        
    • 4)Swift 3.0

      • 处理桥接的对象时,不管是 Swift 对象转 OC 对象,还是 OC 对象转 Swift 对象,都需要使用 as 关键字转化。

        func someMethod(nsstr: NSString) {
            print(nsstr)
        }
        
        let str: String = "abc"
        someMethod(nsstr: str as NSString)
        
        func someMethod(str: String) {
            print(str)
        }
        
        let nsstr: NSString = "abc"
        someMethod(str: nsstr as String)
        

    2、NSArry 类型

    • NSArray 是 Swift 中 Array 类型在 OC 中的形式。

    • 1)如果 NSArray 中保存的是确定类型的元素,桥接到 Swift 中的 Array 依旧保存着 OC 类型的对象。

    • 2)如果 NSArray 没有指定类型,桥接到 Swift 中的是 AnyObject 类型的数组 Array<AnyObject>

      • 所以只要在 iOS 的 API 中看到 AnyObject 类型的数组,就说明它们以前都是 NSArray
      • 使用 Array<AnyObject> 需要使用 as? 或者 as! 转换成具体类型的数组。

    3、NSDictionary 类型

    • NSDictionary 是 Swift 中 Dictionary 类型在 OC 中的形式。

    • 1)如果 NSDictionary 指定了具体的数据类型,在 Swift 中会被桥接成 OC 对象组成的 Dictionary

    • 2)如果 NSDictionary 没有指定具体的数据类型,在 Swift 中被桥接成键是 NSObject 类型、值是 AnyObject 类型的字典 Dictionary<NSObject, AnyObject>

      • 在 OC 中 NSObject 类型是所有类的基类,但是在 Swift 中没有这种类。
      • 由于 NSObject 类有一些在 iOS 中的高级特性,因此 Swift 类也可以继承自 NSObject 类。

    4、基本数据类型

    • 在 Swift 中 IntFloatDoubleBool 都是从 NSNunber 桥接过来的,NSNunber 是 OC 中所有关于数值的对象。

    • IntFloatDouble 这些和 C 语言中的 intfloatdouble 也是桥接好的。

  • 相关阅读:
    2019.8.16
    一种抠环的办法
    [HAOI2015]树上染色
    有关树形背包
    2019.7.27
    有关矩阵快速幂
    2019.7.25
    欧拉函数(转载)
    2019.7.22
    phpstudy集成环境安装redis扩展
  • 原文地址:https://www.cnblogs.com/QianChia/p/8762384.html
Copyright © 2020-2023  润新知