美文网首页
#4 集合类型

#4 集合类型

作者: JamesSawyer | 来源:发表于2018-08-22 13:55 被阅读7次

    Collection Types

    Swift提供了3种常用的集合类型,都实现了泛型集合:

    • Array: 有序数据集合
    • Set: 无序,确保每个元素只出现一次,和JS中的Set类似
    • Dictionary: 字典,类似JS中的对象,swift中的字典使用 [key: value] 这种形式

    1.Array

    创建方式:

    #1
    var someInts = [Int]()
    
    #2
    var someInts: [Int] = []
    var someInts: [Int] = [1, 2, 3]
    
    #3 类型推断
    # 自动推断someInts为 [Int] 类型
    var someInts = [1, 2, 3]
    

    一些方法和属性�:

    • count: 数组的长度
    • isEmpty: 数组是否为空
    • append: 在数组的尾部添加
    • removeLast: 移除最后一个元素,注意数组长度不能为空
    • insert(_ newElement: String, at: Int): 在某个位置插入某个元素
    • remove(at: Int): 移除某个索引上的元素
    #1 构造器创建多个值
    # swift中的构造器也可以重载 因此会有很多参数,下面只是其中一个
    # 重复3次 2.0 自动推断为 [Double]
    var threeDoubles = Array(repeating: 2.0, count: 3)
    // [2.0, 2.0, 2.0]
    
    #2 count 表示数组长度
    threeDoubles.count // 3
    
    #3 isEmpty 是否是空数组
    threeDoubles.isEmpty // false
    
    #4 append 在数组尾部添加,有多个重构 (相当于JS中的push)
    threeDoubles.append(3.0) // [2.0, 2.0, 2.0, 3.0]
    // threeDoubles.append(contentOf: [3.0])
    
    #5 removeLast 移除数组最后一个元素
    # 如果数组不为空,返回被移除得元素
    # 如果数组长度为0,使用这个方法会报错
    # Can't remove last element from an empty collection
    if !threeDoubles.isEmpty {
      threeDoubles.removeLast()
    }
    
    #5 insert 在某个位置插入元素
    var alphas = ["a", "b", "c"]
    alphas.insert("q", at: 1) // ["a", "q", "b", "c"]
    
    #6 remove 移除某个索引位置的元素 返回被移除得元素
    alphas.remove(at: 1) // "q"
    print(alphas) // ["a", "b", "c"]
    

    两个相同类型的数组使用 + 相加,相当于JS中的 concat,会将2个数组拼接在一起

    var a = [1, 2]
    var b = [3]
    var d = b + a // [3, 1, 2]
    

    使用Range的方式,一次性替换多个元素

    var alphas = ["a", "b", "c", "d", "e"]
    // 将索引为1,2,3位置的元素替换
    alphas[1...3] = ["1", "2"]  // 返回替换的元素 ["1", "2"]
    print(alphas) // ["a", "1", "2", "e"]
    // 可以看出替换的数量不一定要求相等 可多可少
    
    var betas = ["a", "b", "c", "d", "e"]
    // 将索引为1,2,3位置的元素替换
    betas[1...3] = ["1", "2", "3", "4"]  // 返回替换的元素 ["1", "2", "3", "4"]
    print(alphas) // ["a", "1", "2", "3", "4", "e"]
    // 可以看出替换的数量不一定要求相等 可多可少
    

    遍历

    • 可以使用 arrayInstance.enumerated() 方法获取每项数据的索引和值,这个和JS中的 entities() 方法很像
    // 普通遍历
    var alphas = ["a", "b", "c"]
    
    for item in alphas {
        print(item)
    }
    // "a"
    // "b"
    // "c"
    
    // 使用 enumerated()
    for (index, value) in alphas.enumerated() {
      print("item \(String(index + 1): \(value))")
    }
    // item 1: a
    // item 2: b
    // item 3: c
    

    2.Set

    无序,相同类型,没有重复元素

    创建方式:

    #1
    var letters = Set<Character>()
    
    #2
    var letters: Set<Character> = []
    letters.insert("a")
    letters // {"a"}
    
    #3
    var gems: Set<String> = ["diamond", "rock"]
    // 根据类型推断 等价于
    var gems: Set = ["diamond", "rock"] // {"diamond", "rock"}
    
    

    一些方法和属性�基本和Array类似,因为是无序集合,Set中没有append方法,还有一些方法也可能不同,这个可以根据编辑器的自动补充功能进行查看,在此略过

    遍历Set集合

    • 普通的 for-in 遍历
    • 对集合使用 sorted() 方法排序之后遍历
    var gems: Set = ["diamond", "rock"]
    gems.insert("glass")
    
    for gem in gems {
        print(gem)
    }
    // glass
    // rock
    // diamond
    
    # 排序之后遍历
    for gem in gems.sorted() {
      print(gem)
    }
    // diamond
    // glass
    // rock
    

    集合操作

    2个集合之间的关系:

    • intersection(_:): 求2个Sets集合的交集
    • symmetricDifference(_:): 求2个Sets集合的差集
    • union(_:): 求2个集合的合集
    • a.subtracting(b): a - b 之后剩下的元素
    var a: Set = [1, 2, 3]
    var b: Set<Int> = [2, 3, 4, 5]
    
    # 交集
    a.intersection(b)  // {2, 3}
    
    # 差集
    a.symmetricDifference(b) // {5, 4, 1}
    
    # 合集
    a.union(b) // {4, 2, 3, 1, 5} 因为无序 所以元素是随机排列的
    
    # a - b 之后的集合
    a.subtract(b) // {1}
    

    集合成员关系和相等性

    2个集合有4种关联:

    • a.isSubset(of:b): a是否是b的子集
    • a.isSuperset(of:b): a是否是b的父集合
    • a.isStrictSubset(of:b) | a.isStrictSuperset(of: b): 判断一个集合是否是另一个集合的子集合或者父集合,并且两个集合并不相等
    • a.isDisjoint(with: b): 2个集合没有交集
    let houseAnimals: Set = ["🐶", "🐱"]
    let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
    let cityAnimals: Set = ["🐦", "🐭"]
    
    houseAnimals.isSubset(of: farmAnimals)
    // true
    farmAnimals.isSuperset(of: houseAnimals)
    // true
    farmAnimals.isDisjoint(with: cityAnimals)
    // true
    

    3.Dictionary 字典

    这玩意和JS中的对象差不多,但是使用的是中括号。

    创建方式:

    #1
    var names = [Int: String]()
    
    #2 注意创建一个空的字典 [:] 中间有一个冒号
    var names: [Int: String] = [:]
    
    #3 类型推断
    var names = ["name1": "james", "name2": "kobe"]
    
    #4 创建不同类型的 Any 类型
    var names: [String: Any] = ["name": "james", "age": 16]
    

    常用的一些方法属性:

    • count
    • isEmpty
    • updateValue(_:forKey)
    • removeValue(forKey)
    var names = ["name1": "james", "name2": "kobe"]
    
    #1 count
    names.count // 2
    
    #2 isEmpty
    names.isEmpty // false
    
    #3 添加新的键值对 直接加即可
    # 如果该key存在 则更新key所对应的value
    # 如果key不存在,则添加新的key-value
    names["name3"] = "durant" // "durant"
    names // ["name1": "james", "name2": "kobe", "name3": "durant"]
    # 更新某个key
    names["name3"] = "west" // "west"
    names // ["name1": "james", "name2": "kobe", "name3": "west"]
    
    #4 updateValue(_:forKey) 返回的是可选类型
    # 注意这个方法和上面直接更新的区别
    names.updateValue("harden", forKey: "name2") // 返回先前值 "west"
    names // ["name1": "kobe", "name": "james", "age": 16, "name2": "harden"]
    // 如果先前没有该key 则生成新的key-value
    names.updateValue("jordan", forKey: "name3") // nil 因为先前没有 "name3" 这个key
    names // ["name1": "kobe", "name": "james", "age": 16, "name2": "harden", "name3": "jordan"]
    
    #5 removeValue(forKey:) 移除某个key-value 如果不存在该key则返回nil
    names.removeValue(forKey: "name3") // "jordan"
    names // ["name1": "kobe", "name": "james", "age": 16, "name2": "harden"]
    
    names.removeValue(forKey: "name5") // nil
    

    遍历:

    • dictInstance.keys: 获取字典的所有keys,注意这不是一个方法
    • dictInstance.values: 获取字典所有的values
    var info: [String: Any] = ["name": "james", "age": 18]
    
    for (key, value) in info {
      print(key, value)
    }
    // name james
    // age 18
    
    for (_, value) in info {
      print(value)
    }
    // james
    // 18
    
    # 使用keys()
    for key in info.keys {
      print(key)
    }
    // name
    // age
    
    # 使用value()
    for value in info.values {
      print(value)
    }
    // james
    // 18
    
    var ss = [String](info.keys) // ["name", "age"]
    

    相关文章

      网友评论

          本文标题:#4 集合类型

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