跳转至

部分内置类型

运算相关

  • Int。整型,在 32 / 64 位机器上分别为 32 / 64 位,如无特殊需求直接使用 Int 即可
  • Double。双精度浮点数
  • Float。单精度浮点数

这些类型均为 struct,也就是说,它们是值类型,传递副本。

IntDouble 都有对应的字面值,字面值与变量是等效的,可以调用类型的方法:

1
2
print(12.negate())            // Int, -12
print(1.2.isEqual(to: 1.2))   // Double, true

Swift 没有 ++ 运算符,使用 += 1 代替。

字符串

字符串与字符串字面值

Swift 中,字符串类型为 String,也是 struct

字符串字面值、字符常量均使用两个双引号表示:

1
2
let greeting = "Hello, World!"      // String
let myCharacter: Character = "H"    // Character

多行字符串使用前后三个引号包围:

1
2
3
4
5
6
7
let softWrappedQuotation = """
The White Rabbit put on his spectacles.  "Where shall I begin, \
please your Majesty?" he asked.

"Begin at the beginning," the King said gravely, "and go on \
till you come to the end; then stop."
"""

从行开头到与末尾 """ 的第一个引号之间的空白字符将被忽略,如下图所示:

原始字符串(raw string)用 #" "##""" """# 包围:

1
let regex = #"\d{1,7}"#

字符串变量是可以更改的:

1
2
var myString = "Swift"
myString += " Programming Language"

字符串格式化

Swift 字符串有一种与 Python 中的 fstring 类似的将任意类型变量插入字符串的方法:

1
2
let name = "Jack"
print("Hello, \(name)!")

String 还提供了 C 风格的格式化构造函数,不过需要注意其占位符与 C 有不同:

1
2
let name = "Jack"
print(String(format: "Hello, %@", name))

集合类型

可变数组 Array

可变数组,相当于 std::vector,为值类型

Array 类型有两种等价的表示方法,一般使用第一种:

1
2
var rectangles: [Rectangle]
var rectangles: Array<Rectangle>

Array 有以下几种常见的构造方法:

1
2
3
let values = [Int]()    // 空数组
let values = [1, 2, 3]
let values = [Int](repeating: 0, count: 3)  // [0, 0, 0]

使用 append、加法运算符增加元素:

1
2
3
var values = [Int]()
values.append(1)    // [1]
values += values    // [1, 1]

使用 remove(at:) 删除元素:

1
2
var values = [1, 2, 3]
let removedValue = values.remove(at: 0) // [2, 3], removedValue == 1

使用下标、firstlast 等来索引,通过 count 获取数量:

1
2
3
4
5
let values = [1, 2, 3]
print(values[1])    // 2
print(values.first) // Optional(1)
print(values.last)  // Optional(3)
print(values.count) // 3

一些常用的对数组进行遍历或者转换的函数:

1
2
3
4
5
6
7
8
9
let values = [1, 2, 3]
// 遍历
values.forEach { print($0) }              // prints 1, 2, 3
// 遍历,将其元素依次转换
let strings = values.map { String($0) }   // ["1", "2", "3"]
// 通过规则过滤
let filteredValues = values.filter { $0 > 1 } // [2, 3]
// 遍历,将结果累积
let sum = values.reduce(0, { $0 + $1 })   // 0 + 1 + 2 + 3 = 6

当然,可以使用 for 循环进行遍历:

1
2
3
4
5
6
7
for value in values {
    print(value)
}

for index in values.indices {
    print("value at index \(index) is \(values[index])")
}

键值对 Dictionary

键值对,对应 std::map,值的类型必须相同。

Dictionary 为值类型,传递副本。

两种等价的表示方法:

1
2
var grades: [String: Double]
var grades: Dictionary<String, Double>

一些常用的构造方法:

1
2
3
let grades: [String: Double] = [:]  // 空
let grades = [String: Double]()     // 空
let grades = ["Alice": 4.0, "Bob": 3.9]

通过键获取元素,类型为 Optional:

1
2
3
let grades = ["Alice": 4.0, "Bob": 3.9]
grades["Carol"] // nil
grades["Alice"] // Optional(4.0)

通过键增加或更改元素:

1
2
3
var grades = ["Alice": 4.0, "Bob": 3.9]
grades["Carol"] = 3.8
grades["Alice"] = 3.99

使用 for 循环进行遍历:

1
2
3
for (name, grade) in grades {
    print("\(name)'s grade is \(grade)")
}

最后更新: 2022年1月17日
作者: Ashitemaru (4.19%), 梁业升 (95.81%)