部分内置类型
运算相关
Int
。整型,在 32 / 64 位机器上分别为 32 / 64 位,如无特殊需求直接使用 Int
即可
Double
。双精度浮点数
Float
。单精度浮点数
这些类型均为 struct
,也就是说,它们是值类型,传递副本。
Int
和 Double
都有对应的字面值,字面值与变量是等效的,可以调用类型的方法:
| print(12.negate()) // Int, -12
print(1.2.isEqual(to: 1.2)) // Double, true
|
Swift 没有 ++
运算符,使用 += 1
代替。
字符串
字符串与字符串字面值
Swift 中,字符串类型为 String
,也是 struct
。
字符串字面值、字符常量均使用两个双引号表示:
| let greeting = "Hello, World!" // String
let myCharacter: Character = "H" // Character
|
多行字符串使用前后三个引号包围:
| 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)用 #" "#
或 #""" """#
包围:
字符串变量是可以更改的:
| var myString = "Swift"
myString += " Programming Language"
|
字符串格式化
Swift 字符串有一种与 Python 中的 fstring
类似的将任意类型变量插入字符串的方法:
| let name = "Jack"
print("Hello, \(name)!")
|
String
还提供了 C 风格的格式化构造函数,不过需要注意其占位符与 C 有不同:
| let name = "Jack"
print(String(format: "Hello, %@", name))
|
集合类型
可变数组 Array
可变数组,相当于 std::vector
,为值类型。
Array
类型有两种等价的表示方法,一般使用第一种:
| var rectangles: [Rectangle]
var rectangles: Array<Rectangle>
|
Array
有以下几种常见的构造方法:
| let values = [Int]() // 空数组
let values = [1, 2, 3]
let values = [Int](repeating: 0, count: 3) // [0, 0, 0]
|
使用 append
、加法运算符增加元素:
| var values = [Int]()
values.append(1) // [1]
values += values // [1, 1]
|
使用 remove(at:)
删除元素:
| var values = [1, 2, 3]
let removedValue = values.remove(at: 0) // [2, 3], removedValue == 1
|
使用下标、first
、last
等来索引,通过 count
获取数量:
| let values = [1, 2, 3]
print(values[1]) // 2
print(values.first) // Optional(1)
print(values.last) // Optional(3)
print(values.count) // 3
|
一些常用的对数组进行遍历或者转换的函数:
| 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
循环进行遍历:
| for value in values {
print(value)
}
for index in values.indices {
print("value at index \(index) is \(values[index])")
}
|
键值对 Dictionary
键值对,对应 std::map
,值的类型必须相同。
Dictionary
为值类型,传递副本。
两种等价的表示方法:
| var grades: [String: Double]
var grades: Dictionary<String, Double>
|
一些常用的构造方法:
| let grades: [String: Double] = [:] // 空
let grades = [String: Double]() // 空
let grades = ["Alice": 4.0, "Bob": 3.9]
|
通过键获取元素,类型为 Optional:
| let grades = ["Alice": 4.0, "Bob": 3.9]
grades["Carol"] // nil
grades["Alice"] // Optional(4.0)
|
通过键增加或更改元素:
| var grades = ["Alice": 4.0, "Bob": 3.9]
grades["Carol"] = 3.8
grades["Alice"] = 3.99
|
使用 for
循环进行遍历:
| for (name, grade) in grades {
print("\(name)'s grade is \(grade)")
}
|