美文网首页swift3.0
Swift3.0 - Array

Swift3.0 - Array

作者: 酷走天涯 | 来源:发表于2016-10-07 22:39 被阅读3133次

    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

    结论:

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

    相关文章

      网友评论

      • 383dd5fb6a9b:let mappedNumbers = numbers.map({ number in
        number*3
        })

        这个in 代表什么意思?
        Jeffzhou2017:而且我想说苹果的排序至少是快速排序吧
        Jeffzhou2017:我想说这个排序是选择排序不是冒泡排序
        SmallTwo:闭包 前面number是参数 后面是返回值

      本文标题:Swift3.0 - Array

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