简介
集合的可变性
- 使用
var
声明的Arrays
、Sets
、Dictionaries
将是可变的,这意味着可以在创建之后添加更多或移除已存在的数据项来改变这个集合的大小;如果使用let
来声明。,则意味着集合是不可变的,大小不能更改。
注意:如果不需要改变集合大小,请用let
将集合声明成常量。
数组(Arrays)
- 数组是编程语言中最常见的一种数据结构,可用于存储多个数据,每个数组元素存放一个数据,通常可通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值。
声明数组
Swift声明数组变量有两种语法:
注意:尽管两种语法在声明形式上基本一致,但是小编推荐使用简化语法声明数组。而且在本文中都会使用这种 形式来使用数组。
创建数组
使用Array
的构造器创建数组
- 使用构造语法
init()
来创建一个由特定数据类型构成的空数组:
var someInts: [Int] = Array()
print(someInts.count)
var cards = [String]()
- 使用构造语法
init(count:,repeatedValue:)
创建一个带有默认值的数组
var numbers: [Double] = Array(count: 3,repeatedValue: 0.0)
print(numbers)
使用简化语法创建数组
- 数组的简化语法直接使用方括号(
[]
)列出多个数组值即可。创建数组的简化语法如:[value1,value2,value3,...]
var values: [Int] = [1,2,3,4,5]
var subjects = ["语文","数学","外语","政治","历史","地理"]
使用两个数组相加创建一个新的数组
var classA = [1,3]
var classB = [4,5,6]
var classC = classA + classB
print(classC)
使用数组
访问与修改数组元素
- 访问数组元素的格式为:
数组名[下标]
,Swift的数组索引是从0开始的,也就是说,第1个数组元素的索引值为0,最后一个数组元素的索引值为数组长度-1
。访问到数组元素后,就可以把一个数组元素当成一个普通变量使用了,包括为该变量赋值(修改)和取出该变量的值,这个变量的类型就是定义数组时使用的类型。
var subjects = ["语文","地理"]
let subject = subjects[0]
print("主修课程:(subject)")
subjects[0] = "物理"
print("主修课程:(subjects[0])")
使用isEmpty
检查count
属性的值是否为0
var colors = ["Red","White","Brown","Black"]
if colors.isEmpty {
print("数组 colors 为空。")
}else {
print("数组 colors 有(colors.count)个元素,不为空。")
}
修改数组
添加元素
- Swift通过
append(newElement: Element)
方法添加元素,每调用一次该方法,程序就会在数组的最后添加一个元素,数组的长度也会自动+1
。
var cards = [String]()
cards.append("A")
cards.append("K")
cards.append("Q")
print(cards)
print(cards.count)
- 除此之外,Swift允许使用加法赋值运算符(
+=
)在数组后面添加一个或多个拥有相同类型的数据项。
cards += ["J"]
print(cards)
print(cards.count)
cards += ["10","9","8"]
print(cards)
print(cards.count)
插入元素
- Swift提供了
insert(newElement: Element,atIndex i: Int)
方法插入元素,需要说明的是,该方法的第二个参数不能超过数组长度(可以等于数组长度,当第二个参数等于数组长度时,调用insert()
方法的效果与调用append()
方法完全相同);否则,调用该方法将会导致数组索引越界的运行时错误。
var languages = ["Swift"]
languages.insert("Objective-C",atIndex: 0)
languages.insert("Java",atIndex: 2)
print(languages)
print(languages.count)
languages.insert("C++",atIndex: 4)
数组和范围
var students = ["小七","小黄","小李","小张","小黑"]
let subRange = students[1..<4]
print(subRange)
students[2...3] = ["小白","小雪"]
print(students)
students[0...1] = ["A","B","C"]
print(students)
- 当程序对指定范围的数组元素赋值时,并不需要指定范围包括的元素个数与所赋值的元素个数相同,如果所赋值的元素少于范围内包含的元素个数,程序将会自动减少Swift数组的长度;如果所赋值的元素多于范围内包含的元素个数,程序将会自动增加Swift的长度。因此,程序可以通过这种方式添加或删除元素,例子如下:
students[0..<students.count] = []
print(students)
删除元素
Swift提供了如下方法来删除元素:
removeAtIndex(index: Int)
:删除指定索引处的元素,该方法的参数不能大于数组的长度-1,否则将会导致数组索引越界。
removeLast()
:删除数组的最后一个元素。
removeAll(keepCapacity keepCapacity: Bool = default)
:清空数组。
var letters = ["A","C","D","E"]
letters.removeAtIndex(2)
print(letters)
letters.removeLast()
print(letters)
letters.removeAll()
print(letters)
数组遍历
var letters = ["A","E"]
for letter in letters {
print(letter)
}
- 如果我们同时需要每个数据项的值和索引值,可以使用
enumerate()
方法来进行数组遍历。enumerate()
返回一个由每一个数据项索引值和数据值组成的元组。我们可以把这个元组分解成临时常量或者变量来进行遍历:
var letters = ["A","E"]
for (index,value) in letters.enumerate() {
print("Item (String(index + 1)) is '(value)'. ")
}
// Item 1 is 'A'.
// Item 2 is 'B'.
// Item 3 is 'C'.
// Item 4 is 'D'.
// Item 5 is 'E'.
字典(Dictionaries)
声明字典
Swift的声明字典变量的有两种语法:
var dict1: Dictionary <String,String>
var dict2: [String : Int]
创建字典
使用Dictionary的构造器创建字典
var scores = [String : Double]()
使用简化语法创建字典
- 字典的简化语法直接使用方括号列出
key-value
对即可,其格式为:[key1:value1,key2:value2,key3:value3,...]
var studentInfo = ["姓名":"小张","年龄":"19岁","地址":"四川成都"]
print(studentInfo)
var emptyDict: [String : Double] = [ : ]
print(emptyDict)
使用字典
读取和修改字典
- 字典最常用的用法就是根据
key
访问字典中对应的value
,包括对value
进行赋值和取出value
的值。访问字典的value
只需再字典变量后紧跟一个方括号([]
),方括号里是字典value
对应的key
。访问到字典的value
后,就可以把value
当成一个普通变量使用了,包括为该变量赋值和取出该变量的值,这个变量的类型就是定义字典时为value
所指定的类型。
var infoDict = ["name" : "Edward"]
print(infoDict["name"])
print(infoDict["noExisy"])
infoDict["name"] = "Charles"
print(infoDict["name"])
infoDict["age"] = "22"
infoDict["address"] = "ChengDu"
infoDict["phone"] = "13219038892"
print(infoDict)
上述例子中,当程序根据key
访问字典对应的value
时,字典并非直接返回字典的value
的类型,而是返回包含value
的可选类型,这是因为字典并不确定程序视图访问的key-value
对是否存在,当该key-value
对存在时,字典返回该key
对应的value
;当key-value
对不存在时,字典返回nil
。
由于字典根据key
访问value
返回的是包含value
的可选类型,因此字典需要对返回的value
使用感叹号进行强制解析。
var infoDict = ["name" : "Edward"]
print(infoDict["name"]!)
- 当程序通过
key
设置字典的value
时,如果对应的key-value
对存在时,程序将会修改该key
对应的value
;如果对应的key-value
对不存在时,程序将会为字典添加key-value
对。上述代码示例中通过这种方式为infoDcit
添加了3组key-value
对。
使用updateValue()
添加或修改字典
- 与使用
字典[key]
形式对value
赋值类似的是,字典还提供了updateValue(value: Value,forKey key: Key) -> Value?
方法,该方法同样可以修改已有key
对应的value
,或key-value
对,但updateValue()
方法更加强大,该方法可以返回被修改的value
之前的原值,这样方便程序检测是否修改成功。
var login = ["account" : "admin","password" : "123456"]
let result1 = login.updateValue("654321",forKey: "password")
print(result1) // 输出 Optional("123456")
let result2 = login.updateValue("123456789@qq.com",forKey: "email")
print(result2) // 输出 nil
print(login) // 输出 [email: 123456789@qq.com,account: admin,password: 654321]
使用isEmpty
检查字典是否为空
isEmpty
属性用于判断集合(包括字典和数组)是否不包含任何元素,当集合不包含任何元素时,该属性返回true
。
var emptyDict: [String : Double] = [ : ]
print(emptyDict.isEmpty)
字典遍历
- Swift允许使用
for-in
循环遍历字典。每一个字典中的数据项都以 (key,value)
元组形式返回,并且我们可以使用临时常量或者变量来分解这些元组:
var studentInfo = ["姓名":"小张","地址":"四川成都"]
for (key,value) in studentInfo {
print("(key):(value)")
}
- 通过访问
keys
或者values
属性,也可以遍历字典的键或者值。
var studentInfo = ["姓名":"小张","地址":"四川成都"]
for value in studentInfo.values {
print("the value is '(value)'.")
}
// the value is '19岁'.
// the value is '四川成都'.
// the value is '小张'.
for key in studentInfo.keys {
print("the key is '(key)'.")
}
// the key is '年龄'.
// the key is '地址'.
// the key is '姓名'.
- Swift允许通过字典的
keys
属性以及values
初始化一个新的数组。
let keys = Array(studentInfo.keys)
let values = Array(studentInfo.values)
- Swift 的字典类型是无序集合类型。为了以特定的顺序遍历字典的键或值,可以对字典的
keys
或values
属性使用sort()
方法。
let tests = ["A" : "1","B" : "2","C" : "3"]
let keys = Array(tests.keys)
print(keys.sort())
字典的可变性和字典的修改
添加、修改key-value
对
删除key-value
对