swift4.1 系统学习四 收集类型(数组、字典、集合)

//
//  main.swift
//  swift04
//
//  Created by iOS on 2018/9/21.
//  Copyright © 2018年 weiman. All rights reserved.
//

import Foundation

/*
 swift学习笔记4-2
 */

//一、收集类型
// 数组(Array),集合(Set),字典(Dictionary)

print("-----------------1.数组---------------------")
//1.数组
//概念:数组是一个可以存放相同类型的多个元素对象的有序线性列表,这些元素对象可以是任意类型,包括元组。
do {
    // 声明一个空数组
    let a = Array<Int>()
    let b: [Int] = []
    let c = [Int]()
    print("a: \(a), b:\(b),c:\(c)")
    //a: [], b:[],c:[]
    
    // 声明非空数组
    let d = [Double](repeating: 3.0, count: 10)
    print("d:\(d)")
    //d:[3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0]
    
    let e = [(Int, Double)](repeating: (1, 0.6), count: 5)
    print("e: \(e)")
    //e: [(1, 0.6), (1, 0.6), (1, 0.6), (1, 0.6), (1, 0.6)]
    
    let f = [1.0, 0.3, 0.4, 0.8, 1.2]
    print("f:\(f)")
    //f:[1.0, 0.3, 0.4, 0.8, 1.2]
    
    // 通过+操作符构建新的数组
    let g = [1, 2, 3]
    let h = [4, 5, 6]
    let i = g + h
    print("i: \(i)")
    //i: [1, 2, 3, 4, 5, 6]
    //数组之所以能够相加,是因为Array声明了 + 这个方法
    /*
       public static func + <Other>(lhs: Array<Element>, rhs: Other) -> Array<Element> where Other : Sequence, Element == Other.Element
     */
}

// 数组元素的访问
do {
    //通过下标操作符访问数组元素
    let a = [1, 2, 3, 4, 5]
    let x = a[0]
    let y = a[2]
    print("x:\(x), y:\(y)")
    
    //注意:只有遵循了Collection协议的类型对象才能作为下标操作符的操作数。
    
}

// 数组的常用属性
do {
    //1. 获取元素个数
    let a = [1, 2, 3, 34,5]
    print("个数: \(a.count)")
    
    //2. 判断数组是否有元素
    print("是否为空: \(a.isEmpty)")
    
    //3. 是否包含某元素
    print("是否包含3: \(a.contains(3))")
    
    //4. 增加元素
    var b = [1, 2, 3, 4, 5, 6]
    
    //在数组最后增加新元素
    b.append(100)
    print(b)
    //在数组中间插入新元素
    b.insert(0, at: 0)
    print(b)
    //移除索引为2的元素
    b.remove(at: 2)
    print(b)
}

// 注意:使用数组的时候,一定要注意数组的越界问题,一旦越界,会造成崩溃

print("-----------------2.集合---------------------")
// 2. 集合
/*
 概念:
 集合:能够存放多个相同类型元素的集合。
 与数组不同点:
 1.集合中不允许出现两个完全相同的元素;
 2.集合中的数据元素是无序的;
 3.并不是所有类型的对象都能作为集合的元素,只有遵循了Hashable协议类型的对象才能作为集合的元素。
 
 swift中的基本类型(String,Int,Float,Double,Bool)都遵循了Hashable协议。
 */

do {
    let a = [1, 2, 3, 4, 5, 5]
    let b: Set = [1, 2, 3, 4, 5, 5]
    print(a)
    print(b)
    /*
     输出:
     [1, 2, 3, 4, 5, 5]
     [5, 3, 1, 4, 2]
     */
    
    //Int类型的空集合
    var setA = Set<Int>()
    
    //创建含有不定元素个数但是包含某些元素的集合
    setA = Set<Int>(arrayLiteral: 1 ,2, 3)
    print(setA)
}

//对集合元素的访问
/*
 注意: 集合是无序的,所以不能通过下标访问集合的元素。集合对元素的存放不是基于索引,而是基于哈希值。
 
 访问集合的方法:
 1.for-in循环
 2.flatMap方法
 */

//常用属性
do {
    //1.元素个数
    let a: Set = [1, 2, 3, 4, 5, 6]
    print("个数: \(a.count)")
    
    //2.是否为空
    print("是否为空集合: \(a.isEmpty)")
    
    //3.是否包含某个元素
    print("是否包含: \(a.contains(5))")
    
    //4.插入元素
    //注意:集合插入的元素位置不定
    var b: Set = ["a", "b"]
    b.insert("c")
    print(b)
    
    //5.删除元素
    b.remove("b")
    print(b)
    
    //6.自定义类型对象作为集合的元素
    struct MyStruct: Hashable {
        // 定义属性
        var a = 0
        var b = 0.0
        
        // 只是demo,实现hashValue方法
        public var hashValue: Int {
            return a.hashValue ^ b.hashValue
        }
        
        // 实现Equatable协议中的 == 操作符类型方法
        public static func == (lhs: MyStruct, rhs: MyStruct) -> Bool {
            return lhs.a == rhs.a && lhs.b == rhs.b
        }
    }
    
    var set = Set<MyStruct>()
    let e1 = MyStruct(a: 10, b: 1.0)
    let e2 = MyStruct(a: -10, b: 0.5)
    print("e1: \(e1)")
    print("e2: \(e2)")
    // 插入对象
    set.insert(e1)
    set.insert(e2)
    
    print("set = \(set)")
    
    //7.两个集合相等
    let s1: Set = [1, 2, 3]
    let s2: Set = [3, 2, 1]
    if s1 == s2 {
        print("s1 == s2")
        
    }
}

print("-----------------3.字典---------------------")
//3. 字典
/*
 概念:字典也是无序集合。不过字典与数组和集合不同,存储的是键值对。
 注意:
 1.字典中的键的类型和值的类型都是在声明中直接确定的。
 2.键的类型必须遵循Hashable协议。
 3.值的类型可以是任意类型.
 */

do {
    // 创建字典
    // 创建一个键是string类型,值是Int类型的空字典
    var a = Dictionary<String, Int>()
    a = ["a": 1]
    print(a)
    
    // 通过字典的不定参数个数的构造方法创造一个字典
    let b = Dictionary<String, Int>(dictionaryLiteral: ("one", 1), ("two", 2))
    print(b)
    
    // 默认构造方法创造字典
    let c = [Int: Float]()
    print(c)
    
    // 通过字典字面量创建字典
    var d: [String: Int] = [:]
    print(d)
    
    d = ["age": 18, "num": 100]
    print(d)
}

do {
    // 访问字典的元素
    var dict:[String: Any] = ["name": "小明",
                              "age": 20,
                              "score": 100,
                              "new": true]
    if let name = dict["name"] {
        print(name)
    }
    
    dict.updateValue("王小明", forKey: "name")
    print(dict)
    
    let test = dict["test"]
    print(test ?? "没有这个值")
}

do {
    // 常用属性
    var dict: [String : Any] = ["name": "Lili",
                                "age": 10,
                                "class": "1班",
                                "from": "England"]
    // 1.元素个数
    print("元素个数: \(dict.count)")
    
    // 2.是否为空
    print("是否空: \(dict.isEmpty)")
    
    // 3. 所有的键
    print("所有的键: \(dict.keys)")
    
    // 4. 所有的值
    print("所有的值: \(dict.values)")
    
    // 5. 更新值
    dict.updateValue("2班", forKey: "class")
    print("更新后: \(dict)")
    
    dict["age"] = 11
    print(dict)
    
    // 6.新增键值对
    dict["interest"] = "看动漫,爬山"
    print(dict)
    
    // 7.删除
    dict.removeValue(forKey: "class")
    print(dict)
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容