前言
- 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
也是桥接好的。