Swift集合类型

作者: dongwenbo | 来源:发表于2017-01-10 16:24 被阅读29次

    Swift有三种集合类型,包括

    • Array,有序可重复
    • Set,无序不可重复
    • Dictionary,无序不可重复(key)的键值对

    集合中数据类型必须相同,集合支持泛型

    集合的可变性

    varlet决定。使用let,编译器会进行优化

    数组(Arrays)

    数组的数据结构为有序列表

    数组的简单语法

    创建数组的几种形式

    let array1 = Array<Int>()
    let array2 = [Int]()
    let array3 = [Int](arrayLiteral: 1,2,3)
    let array4 = [1,2,3]
    

    在数组的类型被确定后,再次使用赋值语句时,swift可以自动推断类型

    let array1 = []//一个类型为[Int]的空数组
    
    带默认值的数组
    let array1 = Array<Int>(repeating: 0, count: 3)
    let array2 = [Int](repeating: 0, count: 3)
    let array3 = Array(repeating: 0, count: 3)
    

    等价于

    [0,0,0]
    
    通过两个数组相加创建一个数组

    使用+来组合两种类型相同的数组。新数组类型自动推断

    let array1 = [Int](arrayLiteral: 1,2,3)
    let array2 = [1,2,3]
    let array3 = array1 + array2
    print(array3)
    
    访问和修改数组

    使用方法,属性和下标对数组进操作
    属性:countisEmpty
    方法:append(_:)insert(_:at:)remove(at:)
    下标:

    var array = [1,2,3]
    array[0] = 10
    

    切片替换:

    var array = [1,2,3,4,5,6,7,8]
    array[1...3] = [10,10,10,10,10,10,10]
    print(array)//[1, 10, 10, 10, 10, 10, 10, 10, 5, 6, 7, 8]
    

    切片和新值的个数不必一致
    remove(at:)下标语法的返回值不是可选类型,这就是说,在越界或者空数组时,会发生运行时错误

    数组遍历

    使用for-in

    var array = [1,2,3,4,5,6,7,8]
    for value in array{
        print(value)
    }
    
    for value in array.enumerated(){
        print(value)//元组
    }
    

    集合

    集合内数据类型相同,没有顺序,值唯一,集合中的值都是可哈希的

    哈希值

    对象相同,哈希值一定相同,哈希值是Int类型的。Swift的所有基本类型(StringIntDoubleBool)都是可哈希的,没有关联值的枚举成员值默认也是可哈希的。
    自定义的类型如果想要作为键值或者集合中的值,必须实现Hashable

    集合的语法
    var set = Set<Int>()
    

    set的类型由于构造器语法Set<Int>被推断为Set<Int>
    类型确定后,以后的赋值就不需要指明类型了

    var set = Set<Int>()
    set.insert(1)
    print(set)
    set = []//不需要指明类型
    
    用数组字面量创建集合

    数组字面量会被推断为数组,所以我们需要显式指明类型

    var set:Set<Int> = [1,2,3,4,]//最后可以多一个`,`
    

    Int类型可以被推断
    简写为

    var set:Set = [1,2,3,4,]
    
    访问修改集合

    属性:countisEmpty
    方法:insert(_:)remove(_:)
    remove(_:)的返回值是可选类型,因为要删除的值在集合中找不到,这点和数组不同,如果硬要说是为了安全性,为什么数组会发生运行时错误呢🙃?

    集合遍历
    var set:Set = [4,2,1,7,10]
    for value in set{
        print(value)
    }
    for value in set.sorted(){
        print(value)
    }
    

    集合是无序的,我们可以使用sorted()函数排序

    既然是集合,肯定有并集交集子集真子集等概念

    集合基本操作

    交集intersection()
    并集union()
    sysmmetricDifference():并集减交集
    subtracting():并集减参数中的那个集合
    不举例了

    集合之间的关系
    • 相等(==),比较两个集合中的元素是否全部相同
    • isSubset(of:),是否子集
    • isSuperset(of:),是否超集
    • isStrictSubset(of:),是否真子集
    • isStrictSuperset(of:),是否真超集
    • isDisjoint(with:),是否不相交

    不举例了

    字典

    键值对组成,键可哈希,不可重复

    创建语法
    var dict1 = Dictionary<Int,String>()
    var dict2:Dictionary<Int,String> = [:]
    var dict3 = [1:"1"]//字面量
    var dict4 = [Int:String]()
    
    访问和修改

    属性:countisEmpty
    方法:updateValue(value,key)下标赋值下标取值removeValue(key)下标删除
    下标赋值updateValue(value,key)都是存在时,更新值,不存在时,插入值。需要特别注意的是,updateValue会返回一个可选类型的值,表示,值存在时返回旧值,值不存在时返回nil
    下标取值返回可选类型表达值缺失,同样是下标取值,数组可没这待遇,😄
    removeValue(key)下标删除都可以删除元素,removeValue(key)会把删除的元素返回,类型为可选,表达值缺失,下标删除为dict[1]=nil的形式

    字典遍历
    var dict = [1:"1",2:"2",3:"3",4:"4",5:"5"]
    
    for value in dict{
        print(value)//一个个元组
    }
    
    for (a,b) in dict{
        print("\(a) \(b)")//起个名字
    }
    
    for key in dict.keys{
        print(key)//只遍历键
    }
    
    for value in dict.values{
        print(value)//只遍历值
    }
    
    for key in dict.keys.sorted(){
        print(key)//给键排序
    }
    
    使用键名或值构建数组
    var array1 = [Int](dict.keys)
    var array2 = [String](dict.values)
    

    上述三种集合与OC中的三种集合都有桥接,但是会出现诡异的问题,建议使用swift风格的集合类型

    相关文章

      网友评论

        本文标题:Swift集合类型

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