Swift 语言因为是从底层重新去构建,区别于 OC 是基于 C,所以在大多数类型的使用上尽可能的做了去 NS 化,使语言更加简洁。所以在 Swift 中大多数类型都可以看到已经没有了前缀。

下面就列举一下常用的类型的变化,我不会去列举所有的类型,那也不太现实,其实我列举几个剩下的大家都能猜大概要怎么写了。

1.基本数据类型

BOOL –> Bool YES/NO --> ```true/fasle != 0/1```

NSInteger –> Int

CGFloat –> Float

Double –> Double

...

这些其实没必要解释太多,除了类型名称发生变化,用法跟 OC 一模一样。

需要另外说明的是 Bool 类型,在 Swift 中 Bool 类型是用 true/false 而不是 YES/NO,而且,true != 1, false != 0,这是跟 OC 有区别的。

2.String

NSString/NSMutableString –> String

如上篇文章所说,在 OC 中的可变类型与不可变类型,在 Swift 中都是同一种类型,区别是声明的方式不同。

let str: String = "abcd" // 此时 str 不能被重新赋值,不能被修改。

var str: String = "abcd" // 此时 str 可以被重新赋值,可以被修改。

事实上,在上面例子中的类型 String 是完全可以省略掉的,在 Swift 中如果语义足够明确,那么声明所指定的类型是可以省略的。

var str = "abcd" // 这已经足够表明 str 是一个 String 类型而不需要再去指定为 String 类型。这也是在开发中的常用写法。

对于可变的 str,在 Swift 中对 str 的操作与 OC 中对 str 的操作,变化很大。这里只举几个常用的例子,更多的内容请自己查阅开发文档。

在 Swift 中 String 遵循了更多的协议。

如Equatable,Comparable协议这使 String 类型可以直接进行相等比较和大小比较

let a = "123"

let b = "123"

print(a == b) // true

print(a > b) // false

遵循 Collection 协议,为 String 增加了很多集合的特性。

var a = "123"

/// 字符串拼接
a.append("4") // 1234

a += "5" /// 12345

/// 按下标获取某一个字符
let c = a[a.startIndex] // (Character)1

/// 字符串截取
let g = a.prefix(3) // 123

let h = a.suffix(3) // 345

let d = a[a.startIndex...a.index(a.startIndex, offsetBy: 2)] // (Substring)123

let count = a.count // 不再是 length,统一跟数组一样是 count

/// 字符串中字符替换
let f = a.replacingOccurrences(of: "3", with: "6")

3.Array

NSArray/NSMutableArray –> Array

初始化一个数组:

let a = Array()

大家是不是觉得该这么写?但是实际上这么写是错误的,因为 Swift 是类型安全的语言,如果在声明一个数组的时候,必须要指定数组中元素的类型。

let a = Array<Any>()

上面的这种写法没问题,是正确的,但是我们还是很少会这么去写,更多的时候我们采用语法糖的形式去初始化一个数组。

let a = [Any]()

这样写起来是不是就简单很多了呢。Swift 中数组的表示方式似乎与 OC 中差别并不是很大,而且他遵循 Collection 协议,数组的操作方式与上面所讲到的 String 的操作方式几乎一样。

var a = ["1", "2", "3"]

a.append("4") // ["1", "2", "3", "4"]

a += ["5"] // ["1", "2", "3", "4", "5"]

a.remove(at: 4) // ["1", "2", "3", "4"]

a.remove(at: a.index(of: "4")!) // ["1", "2", "3"]

a.insert("4", at: 3) // ["1", "2", "3", "4"]

a.joined() // "1234"

在 Swift 中废弃了 OC 中的 for 循环,保留了 for…in…,新增了forEach

a.forEach { (element) in

}

// enumerated()函数 其中 (index, element) 为元祖 (Tuple) 后面会讲到
for (index, element) in a.enumerated() {
    print(index, element)
}

另外需要强调的是 Swift 中的数组支持不同类型的元素在同一个数组中,因为这些类型度属于 Any,还可以包含 nil,所以会看到下面的写法:

var a:[Any?] = ["2", 2, 2.0, nil]

4.Dictionary

字典也属于集合类型,同样遵循 Collection 协议、

字典的初始化,也是必须指定元素的类型,其中 Key 必须遵循 Hashable 协议

let dict = Dictionary<String, Any>()

当然一般也都不这么写,而是跟数组类似的语法糖写法:

let dict = [String: Any]()

字典的一般操作:

var dict = ["a": "123", "b": "456"]

dict.updateValue("789", forKey: "c") // 跟新字典

dict.remove(at: dict.index(forKey: "a")!) // 根据下标移除元素

dict.removeValue(forKey: "b") // 根据 key 移除元素

var dictionary = ["a": 1, "b": 2]

// 字典合并
// 保留旧值:
dictionary.merge(["a": 3, "c": 4]) { (current, _) in current }
// ["b": 2, "a": 1, "c": 4]

// 保留新值:
dictionary.merge(["a": 5, "d": 6]) { (_, new) in new }
// ["b": 2, "a": 5, "c": 4, "d": 6]

5.Tuple

这在 Swift 中是一个新的类型,OC 中不存在元祖,元祖也属于集合类型,同样遵循 Collection

元祖的初始化用()表示

let a = ("13", 222, ["ddd"])

元祖中的元素可以有多种类型表示,通常使用在某一个方法中需要返回多个返回值的情况,

获取元祖中的元素可以使用:

print(a.0, a.1, a.2)

a.0 = "35"

元祖所需要介绍的内容不多,用法也比较简单。

至于其他的内容,我相信你看官方文档会比我的跟全面,更快。本文章也是重在入门,不在搬运官方文档。