美文网首页
Swift中的数组

Swift中的数组

作者: 下班不写程序 | 来源:发表于2019-10-08 10:27 被阅读0次
  1. 使用 let 定义 不可变数组.
  2. 使用 var 定义 可变数组.
  3. 数组使用 [ ] 来表示.
  4. Swift中 数组可以直接承载基本数据类型.

1. 数组的定义和取值

    func demo(){
        
        // 定义一个不可变数组 (里面可以直接承载基本数据类型)
        let array = [1, 2, 3, 4, 5]
        // 根据下标取 对应元素
        let num = array[3]   // 也就是4
        
        // 定义一个指令类型的(字符串)、不可变的数组
        let array2: [String] = ["老王", "老张"]
        
        /* 当一个数组内想要承接不同数据类型时, 就需要进行类型转化处理, 这里类比一下
         NSObject -> 代表 OC 的对象
         AnyObject -> 代表 任意对象, 也就相当于 OC 的 id
         Any -> 更加强大, 不仅代表任意类型的对象, 还代表基本数据类型
         */
        // 声明一个数组, 里面含有不同类型的元素, 就需要制定以下Any类型, 作用就是:数组内承接什么类型的元素都可以
        let array3 = ["老王", 18] as [Any]
    }

2. 数组的遍历

    func demo(){
        
        // 声明一个数组
        let array = ["老王", "老李", "老张", "老刘"]
        
        // 1. 正序遍历
        for name in array {
            print(name)
        }
        // 结果:老王 老李 老张 老刘
        
        // 2. 倒序遍历
        for name in array.reversed() {
            print(name)
        }
        // 结果:老刘 老张 老李 老王
        
        // 3. 正序遍历, 关心下标    -- 注: 不管你怎么命名, 只要关心下标, 第一个肯定是下标!!!!
        for (i, name) in array.enumerated() {
            print(i, name)
        }
        // 结果: 0 老王 1 老李 2 老张 3 老刘
        
        // 4. 倒序遍历, 关心下标
        for (i, name) in array.reversed().enumerated() {
            print(array.count - i, name)
        }
        /*
         结果: 4 老刘 3 老张 2 老李 1 老王
         要求分析: 原数组的标号不变, 倒序重新遍历打印;
         打印分析: 当数组倒序操作后, 数组的元素也会重新标号,所以为了对应原始数组的标号, 这里需要使用count - i
         */
    }

3. 数组的合并

1.数组的合并 : 使用加号合并.
2.难点: 不同数组内部的元素数据类型不同, 需要先进行类型转换,再合并

3.1 错误的示范
    func demo(){
    
        let array1 = ["老王", "老张"]
        let array2 = [18, 19]
        let result = array1 + array2
        /* 报错: Type of expression is ambiguous without more context
         释义: 表达式类型不明确,没有更多上下文
         */
        print(result)
    }
3.1 正确的示范
    func demo(){
        
        // 指定数组array 的类型为Any
        let array: [Any] = ["老王", "老张"]
        // 指定数组array2 的类型为Any
        let array2: [Any] = [18, 19]
        // 自然而然, 根据自然推倒可以得出, 合并后的数组result类型也为 Any
        let result = array + array2
        print(result) // 结果:["老王", "老张", 18, 19]
    }

4. 数组元素的移除

    func demo(){
        
        // 想要移除数组中的元素, 首先这需要是一个可变数组
        var array: [Any] = ["老王", 17, "asdfgh", "不想睡", "一整夜"]
        
        // 1. 移除置顶元素 -- 按照下标
        array.remove(at: 2)
        print(array)  // 结果:["老王", 17, "不想睡", "一整夜"]
        
        // 2. 移除第一个/最后一个 元素 -> 有返回值: 返回值就是移除的元素
        array.removeFirst()
        array.removeLast()
        print(array)   // 结果:[17, "不想睡"]
        
        /* 3. 数组中元素的替换
         replaceSubrange(<#T##subrange: Range<Int>##Range<Int>#>, with: <#T##Collection#>)
         参数1: 替换范围
         参数2: 传入数组, 也就是替换的内容
         总结: 就是想替换范围的内容完全替换成参数2
         
         0..<1 代表 [0, 1)
         */
        array.replaceSubrange((0..<1), with: ["哈哈", "呵呵", "嘿嘿", "嗷嗷", "啊啊"])
        print(array)  // 结果:["哈哈", "呵呵", "嘿嘿", "嗷嗷", "啊啊", "不想睡"]

        // 4. 移除所有元素的情况下是否保持原容量(默认为: false) -- 注: 在移除之前, 需要指定该数组的容量, 当移除之后,再次需要重新分配内存之前就可以存储之前设置好的容量的个数的值
        print("移除前: \(array.capacity)")    // 10 (原始5个, 一共移除了3, 五换一, 在原来的基础上开辟新的内存, 5+5, 这里了解就好)
        // 注意: 这里记录的一直都是可变数组的最大容量
        array.removeAll(keepingCapacity: true)
        print("移除后: \(array.capacity)")    // 10
        
        // 5. 扩展: 数组的容量只呈偶数增长,没有规律可言.
        // 5.1 实例化一个元素类型为Int类型空数组
        // 标准格式: let/var 常量名/变量名:[类型] = [类型]()
        // 以下三种方式都可以, 怎么喜欢怎么来
        
//        var arr: [Int] = [Int]()
//        var arr: [Int] = []
        var arr = [Int]()
        for i in 0..<200 {
            arr.append(i)
            // 打印数组容量
            print(arr.capacity)
        }
    }

最后, 以上内容如有问题, 欢迎指正, 或者有其他的问题, 也欢迎留言讨论~

相关文章

网友评论

      本文标题:Swift中的数组

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