Swift 数组
标签(空格分隔): Swift
数组的介绍
- 数组(Array)是一串有序的由相同类型元素构成的集合
- 数组中的集合元素是有序的,可以重复出现
- Swift中的数组
- swift数组类型是Array,是一个泛型集合
数组的初始化
- 数组分成:可变数组和不可变数组
- 使用let修饰的数组是不可变数组
- 使用var修饰的数组是可变数组
// 定义一个可变数组,必须初始化才能使用
var array1 : [String] = [String]()
// 定义一个不可变数组
let array2 : [NSObject] = ["why", 18]
- 在声明一个Array类型的时候可以使用下列的语句之一
var stuArray1:Array<String>
var stuArray2: [String]
- 声明的数组需要进行初始化才能使用,数组类型往往是在声明的同时进行初始化的
// 定义时直接初始化
var array = ["why", "lnj", "lmj"]
// 先定义,后初始化
var array : Array<String>
array = ["why", "lnj", "lmj"]
与Foundation框架中的数组区别
var x = [1,2,3]
print("address : \(Unmanaged.passUnretained(x as AnyObject).toOpaque())") //0x000060800003a7c0
var y = x
print("address : \(Unmanaged.passUnretained(y as AnyObject).toOpaque())") //0x000061800002e220
y.append(5)
print("address : \(Unmanaged.passUnretained(y as AnyObject).toOpaque())") //0x000061800002e220
print(x) //[1, 2, 3]
print(y) //[1, 2, 3, 5]
- Swift的Array这里面采用的'写时复制',刚开始x赋值给y时,这个时候他们共享一套存储值,而在y更改时,才进行值的复制并把新的值赋值给y,注意x赋值给y,他们不是同一个指针!
let a = NSMutableArray(array: [1,2,3])
print("address : \(Unmanaged.passUnretained(a as AnyObject).toOpaque())") //0x000060800003a7c0
let b : NSArray = a
print("address : \(Unmanaged.passUnretained(b as AnyObject).toOpaque())") //0x000060800003a7c0
a.insert(4, at: 3)
print(a) //[1,2,3,4]
print(b) //[1,2,3,4]
- Foundation框架中指的是同一块内存区域
- 如果也想像Swift中使用数组方式如下
let c = NSMutableArray(array: [1,2,3])
//这个时候是创建一块新的内存区域存放c的值,并指向d
let d = c.copy() as! NSArray
c.insert(4, at: 3)
print(c) //[1,2,3,4]
print(d) //[1,2,3]
对数组的基本操作
// 添加数据
array.append("yz")
// 删除元素
array.removeFirst()
// 修改元素
array[0] = "why"
// 取值
array[1]
数组的其他用法
var arr = [1,2,3,4,5,6,7,8,9]
//迭代
for x in arr {
//print(x) //[1,2,3,4,5,6,7,8,9]
}
//迭代除第一个元素以外的部分
for x in arr.dropFirst() {
//print(x) //[2,3,4,5,6,7,8,9]
}
//迭代除最好3个元素以外的数组
for x in arr.dropLast(3) {
//print(x) //[1,2,3,4,5,6]
}
//列举元素和对应下标
for (key, value) in arr.enumerated() {
//print("第\(key)元素,它的值是\(value)")
//第0元素,它的值是1 ....
}
//想要寻找一个元素的位置
let idx = arr.index(of: 4)
//注:
//Swift不鼓励做索引的计算,手动计算索引可能会导致很多的潜在bug.
arr.removeLast() //删除最后一个元素,数组为空则会崩溃
arr.popLast() //删除最后一个元素并且返回他,数组为空则nil不执行
//数组的first和last返回时可选值,如果数组为空则会返回nil
//arr的first 相当于 arr.isEmpty ? nil : arr[0]
数组高级用法-MAP(数组变形)
//创建一个新的数组,值位arr的各个平方
let arr = [1,2,3,4,5,6,7,8,9]
//旧思路
var newArr:[Int] = []
for value in arr {
newArr.append(value * value)
}
print(newArr) //[1, 4, 9, 16, 25, 36, 49, 64, 81]
//新的思路map
//标准
let newArr = arr.map {(number: Int) -> Int in
return number * number
}
//简化
let newArr = arr.map {number in number * number}
//最简单
let newArr = arr.map {$0 * $0}
//map其他用法
let arr = ["axxx", "bxxx", "cxxx", ""]
let newArr = arr.map { str -> Int? in
let length = str.characters.count
guard length > 0 else {
return nil
}
return length
}
print(newArr) //[Optional(4), Optional(4), Optional(4), nil]
let array = [1,2,3,4,5,6]
//判断有没有能被2整除的数据(两种方式)
let isTure = array.map { $0 % 2 == 0 }.contains(true)
let isTrue = array.contains {$0 % 2 == 0}
数组高级用法-FlatMap(数组变形)
//对数据解包,去除nil
let name = ["paus","ssssss","wjkf"]
let isS = name.map { str -> String? in
guard str.hasSuffix("s") else {
return nil
}
return str
}
let isSF = name.flatMap {str -> String? in
guard str.hasSuffix("s") else {
return nil
}
return str
}
print(isS) //[Optional("paus"), Optional("ssssss"), nil]
print(isSF) //["paus", "ssssss"]
//flatMap 还能把数组中存有数组的数组 一同打开变成一个新的数组
let array = [[1,2,3], [4,5,6], [7,8,9]]
// 如果用map来获取新的数组
let arrayMap = array.map { $0 }
print(arrayMap) // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
// 用flatMap
let arrayFlatMap = array.flatMap { $0 }
print(arrayFlatMap) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
// 这种情况是把两个不同的数组合并成一个数组 这个合并的数组元素个数是前面两个数组元素个数的乘积
let fruits = ["apple", "banana", "orange"]
let counts = [1, 2, 3]
let fruitCounts = counts.flatMap { count in
fruits.map { fruit in
(fruit, count)
}
}
print(fruitCounts) // [("apple", 1), ("banana", 1), ("orange", 1), ("apple", 2), ("banana", 2), ("orange", 2), ("apple", 3), ("banana", 3), ("orange", 3)]
数组高级用法-Filter
filter:通过过滤条件过滤数组,并将符合条件的值放入创建的新数组中
//1-10中将能被2整除的过滤出来
let arr = (0...10).filter {$0 % 2 == 0}
print(arr) // [0, 2, 4, 6, 8, 10]
//找到100以内是偶数并且是其他数的平方
let arr = (1...10).map{$0 * $0}.filter{$0 % 2 == 0}
print(arr) //[4, 16, 36, 64, 100]
数组高级用法-contain
//如果你想通过Filter筛选大数组中符合条件的形成的数组count大于0来判断,不建议这么做!
bigArray.filter {条件}.count > 0
//filter会创建一个新的数组并对里面所有的元素进行操作,但是事实上我们只想判断至少有一个满足条件即可,所有用contain.
bigArray.contains {条件}
//这个方法比上面的方法快:1.他不会创建新的数组,2.当他匹配到第一个满足条件的就退出了.
//判断数组中是否存储以"f"结尾的字符串
let name = ["paus","ssssss","wjkf"]
let isF = name.contains {$0.hasSuffix("f")}
数组高级用法-reduce
map,filter,flatMap都是便利数组,并且生产出一个新的数组,但是有时仅仅是想合并成一个新的元素
//原始写法
var total = 0
let numbers = [1,2,3,4,5]
for num in numbers {
total += num
}
print(total)
//reduce写法
let sum1 = numbers.reduce(0) { (total, num) -> Int in
return total + num
}
print(sum1) //15
let sum2 = numbers.reduce(0) {total, number in total + number}
print(sum2) //15
let sum3 = numbers.reduce(0, +)
print(sum3) //15
//输出类型可以和输入类型不一样
let sum4 = numbers.reduce(""){ str, num in str + "\(num) "}
print(sum4) //1 2 3 4 5 String类型
数组高级用法-sort
//基本使用
let arr1 = [2,545,7,24,67,983,110]
let newA1 = arr1.sorted()
let newA2 = arr1.sorted {$0 > $1}
print(newA1) //默认[2, 7, 24, 67, 110, 545, 983] 从小到大
print(newA2) //[983, 545, 110, 67, 24, 7, 2] 从大到小
//高级使用
let arr2 = [(age:29,name:"sUs"),(age:19,name:"sAs"),(age:12,name:"lkx"),(age:32,name:"sDf"),(age:5,name:"DDD")]
//1.按年龄排序
let newA3 = arr2.sorted {$0.age < $1.age}
print(newA3) //[(age: 5, name: "DDD"), (age: 12, name: "lkx"), (age: 19, name: "sAs"), (age: 29, name: "sUs"), (age: 32, name: "sDf")]
//2.判断是否包含未成年人
let newA4 = arr2.contains {$0.age < 18}
print(newA4) //true
//3.筛选出未成年人
let newA5 = arr2.filter {$0.age < 18}
print(newA5) //[(age: 12, name: "lkx"), (age: 5, name: "DDD")]
//4.忽略名称的大小写排序
let newA6 = arr2.sorted{$0.name.uppercased() < $1.name.uppercased()}
print(newA6) //[(age: 5, name: "DDD"), (age: 12, name: "lkx"), (age: 19, name: "sAs"), (age: 32, name: "sDf"), (age: 29, name: "sUs")]
网友评论