Swift3.0 - Array

Swift3.0 - 真的很简单
Swift3.0 - 数据类型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可选值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 对象和类
Swift3.0 - 属性
Swift3.0 - 函数和闭包
Swift3.0 - 初始化和释放
Swift3.0 - 协议protocol
Swift3.0 - 类和结构体的区别
Swift3.0 - 枚举
Swift3.0 - 扩展
Swift3.0 - 下标
Swift3.0 - 泛型
Swift3.0 - 异常错误
Swift3.0 - 断言
Swift3.0 - 自动引用计数(strong,weak,unowned)
Swift3.0 - 检测API
Swift3.0 - 对象的标识
Swift3.0 - 注释
Swift3.0 - 元类型
Swift3.0 - 空间命名
Swift3.0 - 对象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 类簇
Swift3.0 - 动态调用对象(实例)方法
Swift3.0 - 文本输出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 镜像
Swift3.0 - 遇到的坑

基本

  • 定义
list1 = ["你好","2","3","4"]
let list2:[String] = ["你好","2","3","4"]
let list3:[Any] = ["你好","2","3",3,UILabel()]
let list4:NSArray =  ["你好","2","3","4",UILabel()]
let list5:NSMutableArray =  ["1","2","3","4"]
  • 清空数组
list2.removeAll() //  如果定义为var
list2 = [] // 如果定义为var
list5.removeAllObjects() // var 和let 都可以
list5 = [] // 如果定义为var
  • 取代操作
shoppingList[4...6] = ["Bananas", "Apples"] // 将数组4...6 的范围用指定的数组取代
  • 插入移除操作
 shoppingList.insert("Maple Syrup", at: 0)
 let mapleSyrup = shoppingList.remove(at: 0)
 let apples = shoppingList.removeLast()
  • 遍历数组
 for item in shoppingList {
  print(item)
 }
 for (index, value) in shoppingList.enumerated() {
    print("Item \\(index + 1): \\(value)")
 }

高级

  • 认识map

看一下它的定义

func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]

解释:
T 为泛型
transform: 闭包函数 我们需要给它传入一个有参数有返回值的闭包函数
[T] 函数会返回给我们一个T类型的数组

应用:我们有这样一个需求,给一组数据中大于20的数字乘以3

//1.先定义一个数组
var numbers = [21, 19, 7, 12]
//2.创建一个有一个参数一个返回值的闭包函数
var closure = {(number:Int) -> Int in
var  result = number
if number > 20 {
result *= 3
}
return result
}
//3.调用map函数
print(numbers.map(closure))

由于swift有类型推断的功能,我们可以这样写

let mappedNumbers = numbers.map({ number -> Int in
    if number > 20{
      return 3 * number
    }
      return number
})

如果没有逻辑判断,给所有值统一乘以3,我们甚至可以这样写

let mappedNumbers = numbers.map({ number -> Int in
  return number*3
})

再简洁点

let mappedNumbers = numbers.map({ number  in
   number*3
})

如果你要将数组中的值全部替换为0你可以像下面这样

 let mappedNumbers = numbers.map({_ in 
   return 0
})

我们测试一下 for ... in 和 map的速度
测试1:数组numbers的数字变为 0

for ... in

var numbers = Array(repeating: 3, count: 1000000)
var date1 = NSDate()
for i in 0..<numbers.count{
  numbers[i] = 0
}
print(NSDate().timeIntervalSince(date1 as Date))

运行两次测试数据

0.0242440104484558
0.0248509645462036

map

var numbers = Array(repeating: 3, count: 1000000)
var date1 = NSDate()
var newNumbers = numbers.map({_ in
    return 0
})
print(NSDate().timeIntervalSince(date1 as Date))

运行两次结果

0.219065964221954
0.201902985572815

我测试一下小数据 同时给100个数字的数组设置值
for ... in

0.000165998935699463

map

0.0013270378112793

结论:
在执行速度上还是for...in 比较快

问题1 :map的优势在哪里呢?


sort 排序

public func sorted(by areInIncreasingOrder: (Element, Element) -> Bool) -> [Element]

参数:

areInIncreasingOrder 两个参数一个返回值得闭包

我们给1万个数组进行排序,测一下for in 循环排序的时间

// 冒泡排序法

ar date1 = NSDate()
numbers.sort(by: {$0 > $1})
var swap:Int
for i in 0..<numbers.count{
    var num = numbers[i]
    for j in i..<numbers.count{
       if num < numbers[j]{
           (num,numbers[j]) = (numbers[j],num)
      }
  }
}

运行结果

3.54646998643875
3.48700600862503

使用sort 对100万个数字进行排序

var numbers = Array(repeating: 3, count: 1000000)
for i in 0..<numbers.count{
    numbers[i] = i
}
var date1 = NSDate()
numbers.sort(by: {$0 > $1})
print(NSDate().timeIntervalSince(date1 as Date))

运行结果

2.71596896648407
2.66568303108215

结论:

如果使用排序建议使用苹果给我们提供的方法

推荐阅读更多精彩内容