前言
- iOS 中的 API 基本都是在许多年前由 OC 写成的,现在通过桥接的方法在 Swift 中可以用,基本看不出区别,非常自然。但是一些特殊的类型,在两种语言进行桥接的时候需要特别注意。
1、NSString 类型
-
NSString是 Swift 中String类型在 OC 中的形式。 -
1)Swift 1.2
- 弱化了
String和NSString类型的桥接,这为在 Swift 中调用 OC 代码制造了一定的困难,因为大量的 OC 方法都存在NSString类型的参数。
- 弱化了
-
2)Swift 2.0
String和NSString又能亲密无间的互相传递了。
-
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!转换成具体类型的数组。
- 所以只要在 iOS 的 API 中看到
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类。
- 在 OC 中
4、基本数据类型
-
在 Swift 中
Int、Float、Double、Bool都是从NSNunber桥接过来的,NSNunber是 OC 中所有关于数值的对象。 -
Int、Float、Double这些和 C 语言中的int、float、double也是桥接好的。