Swift 语言提供Arrays、Sets和Dictionaries三种基本的集合类型用来存储集合数据。数组(Arrays)是有序数据的集。集合(Sets)是无序无重复数据的集。字典(Dictionaries)是无序的键值对的集。今天我们就先来了解一下数组(Arrays):
- Array的声明和定义
- Array遍历元素
- Array的增、删、改、查
- Array子数组
- Array查询某一元素
Array的声明和定义
就像Swift说的那样,我是这样理解的:
凡是用let声明的都是不可变的(类似OC中的NSArray);
凡是用var声明的都是可变的(类似OC中的NSMutableArray);
1.创建一个空的字符串
// 使用构造语法来创建一个由特定数据类型构成的空数组:
var myInts = [Int]() // 可变的Int数组
let yourStrings = [String]() // 不可变的String数组
2.创建一个带有默认值的数组
// Swift 中的Array类型还提供一个可以创建特定大小并且所有数据都被默认的构造方法。我们可以把准备加入新数组的数据项数量(count)和适当类型的初始值(repeating)传入数组构造函数:
var threeDoubles = Array(repeating: 0.0, count: 3) // threeDoubles 是一种 [Double] 数组,等价于 [0.0, 0.0, 0.0]
/*可以使用数组字面量来进行数组构造,这是一种用一个或者多个数值构造数组的简单方法。数组字面量是一系列由逗号分割并由方括号包含的数值:
[value 1, value 2, value 3]
*/
var programmingLanguages : [String] = ["C", "C++", "java", "OC", "Swift"]
// 由于 Swift 的类型推断机制,用字面量构造只拥有相同类型值数组的时候,不必把数组的类型定义清楚
var PLanguages = ["C", "C++", "java", "OC", "Swift"] // 与上面的声明是等效的
Array遍历元素
1.正向遍历
// 声明一个数组PLanguages : [String]
let PLanguages = ["C", "C++", "java", "OC", "Swift"]
// 1.遍历元素
for item in PLanguages {
print(item);
}
// 2.元组式遍历元素
for (index, value) in PLanguages.enumerated() {
print("\(index)\t" + value);
}
结果如下:
2.反向遍历
// 1.遍历元素
for item in PLanguages.reversed() {
print(item);
}
// 2.元组式遍历元素
for (index, value) in PLanguages.reversed().enumerated() {
print("\(index)\t" + value);
}
结果如下
Array的增、删、改、查
以公司内职工的姓为例 建立数组
1.增加元素
// 声明一个数组staffSurnames : [String]
var staffSurnames = ["zhang", "wang", "li", "zhang", "zhao"]
// 增加了一个孙姓员工
staffSurnames.append("sun")
// 又增加了一个李姓、一个周姓员工
let newStaffs = ["li", "zhou"]
staffSurnames.append(contentsOf: newStaffs)
// Swift 也可使用以下代码方便操作
staffSurnames += ["sun"]
staffSurnames += ["li", "zhou"]
效果如下
以上是在数组尾部添加新元素,接下来自定义位置添加元素:
// 声明一个数组staffSurnames : [String]
var staffSurnames = ["zhang", "wang", "li", "zhang", "zhao"]
// 在第二个人后面增加一个孙姓员工
staffSurnames.insert("sun", at: 2);
// 一次在某个位置添加多个员工 (郑 王)
staffSurnames.insert(contentsOf: ["zheng", "wang"], at: 2);
// 也可用替换的方式添加 下面是实现方案 效果同上
staffSurnames.replaceSubrange(2..<2, with: ["sun"])
staffSurnames.replaceSubrange(2..<2, with: ["zheng", "wang"])
效果如下
2.删除元素
// 声明一个数组staffSurnames : [String]
var staffSurnames = ["zhang", "wang", "li", "zhang", "zhao", "zhang", "wang", "li", "zhang", "zhao"]
/*
注意: 删除元素的时候一定要用staffSurnames.isEmpty来判断是否为空数组
*/
// 删除首个元素
staffSurnames.removeFirst() // 返回 删除元素值
staffSurnames.remove(at: 0) // 与上述等价
// 从首个元素删除至某个位置元素
staffSurnames.removeFirst(1);
// 删除最后一个元素
staffSurnames.removeLast() // 返回 删除元素值
staffSurnames.remove(at: staffSurnames.count-1) // 与上述等价
// 从某个位置元素删除至最后
staffSurnames.removeLast(staffSurnames.count-3)
/*************** 重置staffSurnames *****************/
staffSurnames = ["zhang", "wang", "li", "zhang", "zhao", "zhang", "wang", "li", "zhang", "zhao"]
// 删除指定位置元素
staffSurnames.remove(at: 1) // 返回 删除元素值
// 删除指定范围元素
staffSurnames.removeSubrange(0..<2)
// 删除所有元素
staffSurnames.removeAll()
效果如下
3.修改元素
// 声明一个数组staffSurnames : [String]
var staffSurnames = ["zhang", "wang", "li","zhao"]
// 修改和简单
staffSurnames[1] = "张";
/*
注: 也可使用替换的方式修改
*/
4.查找元素
// 声明一个数组staffSurnames : [String]
var staffSurnames = ["zhang", "wang", "li","zhao", "zhao", "sun", "zhao"]
// 数组是否包含该元素
staffSurnames.contains("li")
staffSurnames.contains("liu")
// 该元素首次出现的下标
staffSurnames.index(of: "zhao")
效果如下
Array子数组
// 声明一个数组staffSurnames : [String]
var staffSurnames = ["zhang", "wang", "li","zhao", "zhao", "sun", "zhao"]
// 1.从首个元素到第4个元素
staffSurnames.prefix(upTo: 5) // 5是指数组只包含5个元素 也是指到下标为5的元素但是不包含下标为5的元素
staffSurnames.prefix(through: 4) // 指到下标为4的元素 并且 包含下标为4的元素
staffSurnames.prefix(5) // 效果同上
staffSurnames.prefix(10).count // 就像10一样超出数组 就生成一个和原数组一样的数组
// 2.从某个元素到最后一个元素
staffSurnames = ["zhang", "wang", "li","zhao", "zhao", "sun", "zhao"]
staffSurnames.suffix(from: 2) // 指从下标为2的元素 并且 包含下标为2的元素
staffSurnames.suffix(2) // 最后两个元素
staffSurnames.suffix(10) // 就像10一样超出数组 就生成一个和原数组一样的数组
效果如下
Array查询某一元素
数组中循环查找某个元素,查找出所有下标
// 方法一
func getInts(array : [String], str: String) -> [Int] {
var myArray = array;
var indexs = [Int]();
var index = -1;
while myArray.contains(str) {
var temp = myArray.index(of: str)!
myArray.removeFirst(temp+1)
temp += 1
index += temp
indexs.append(index)
}
return indexs;
}
// 声明一个数组staffSurnames : [String]
var staffSurnames = ["zhang", "wang", "li","zhao", "zhao", "sun", "zhao"]
getInts(array: staffSurnames, str: "zhao")
结果:
// 方法二
func getInts(array : [String], str: String) -> [Int] {
var indexs = [Int]();
for (index, value) in array.enumerated() {
if value == str {
indexs.append(index)
}
}
return indexs;
}
// 声明一个数组staffSurnames : [String]
var staffSurnames = ["zhang", "wang", "li","zhao", "zhao", "sun", "zhao"]
getInts(array: staffSurnames, str: "zhao")
结果