美文网首页
Swift 数组

Swift 数组

作者: 爱做梦的星星 | 来源:发表于2017-08-19 17:15 被阅读0次

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")]

相关文章

网友评论

      本文标题:Swift 数组

      本文链接:https://www.haomeiwen.com/subject/rmgtdxtx.html