swift 3.0 再探索 - 2.Array & Dictionary
2016-08-01 14:53
176 查看
swift 3.0 再探索 - 2.Array & Dictionary
上一章讲了Swift 3.0的String 和 String常用的API,这一篇讲解一下 Array 和 Dictionary。(这里顺便提一下Set–集合)
在swift中关于Array和Dictionary:
Array:有序可重复, 用于存储同一类型的值. 最常用。
Dictionary:值无序可重复,但每个值有唯一的标记(Key)
Set:值无序不重复。
Array, Set和Dictionary在开发中,可以做为一种临时存取的数据结构,在开发中很多时候都对这些基本类型进行操作,下面三种类型一起讲解,相互对比一下:
- 创建
//不可变的,无法修改,改变 let constArray : [String] = ["1", "2", "3", "4", "5", "2"] let constDict : Dictionary<String, String> = ["1": "1", "2" : "2"] let constSet : Set = ["1", "2", "3", "4", "5", "2"] print(constArray) print(constDict) print(constSet) //可变,可以修改值,长度,元素 var mutableArray : [String] = ["1", "2", "3", "4", "5", "2"] var mutableDict1 : Dictionary<String, String> = ["1":"1", "2":"2"] var mutableDict2 : [String : String] = ["3":"3" , "4":"4", "5":"5"] var mutableSet : Set<String> = ["1", "2", "3", "4", "5", "2"] print(mutableArray) print(mutableDict1) print(mutableDict2) print(mutableSet) //打印结果 let 声明 ["1", "2", "3", "4", "5", "2"] ["1": "1", "2": "2"] ["1", "2", "3", "5", "4"] var 声明 ["1", "2", "3", "4", "5", "2"] ["1": "1", "2": "2"] ["3": "3", "5": "5", "4": "4"] ["1", "2", "3", "5", "4"]
Array 的声明: 变量/常量名 : [元素类型] = [元素, 元素, 元素, 元素, 元素]
– 元素类型可以写成<元素类型>, 或直接等于数组结构。
Set 的声明: 变量/常量名 : Set<元素类型> = [元素, 元素, 元素, 元素, 元素]
– Set虽不能类型判断,但是可以省略<元素类型>
Dictionary 的声明: 变量/常量名 : Dictionary<键的类型,值的类型> = [键:值]
– 或写成:变量/常量名 : [键的类型 : 值的类型] = [键:值]
特殊创建
//创建一个有默认值的数组,加参数count和repeatedValue let people = Array.init(repeating: "中国人", count: 12) /* 或写成 let people = [String](repeating: "中国人", count: 12) 一个String类型数组,有12个元素,这12个元素都是重复的"中国人"字符串 */ let person1 = people.first print("有\(people.count)个\(person1!)") //打印结果:"有12个中国人\n" //创建一个有序范围的Int数组,Array(起始值...终止值) let oneToHundred = Array(1...100) print(oneToHundred) //打印结果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
let和var的取值类型一致,下面接以var声明作为讲解例子。
- 取值
var mutableArray = ["1", "two", "3", "four", "5"] var mutableSet : Set = ["北京", "上海", "广州", "深圳", "天津"] var mutableDict = ["Animal1":"Dog", "Animal2":"Cat", "Animal3":"Mouse"] //判断是否为空 let arrIsEmpty = mutableArray.isEmpty //Bool --> "false" let setIsEmpty = mutableSet.isEmpty //Bool --> "false" let dictIsEmpty = mutableDict.isEmpty //Bool --> "false" //Array 取值 let arrIndex1 = mutableArray.first //String? --> "1" let arrIndex2 = mutableArray[mutableArray.index(after: 0)] //String? --> "two" let arrIndex3 = mutableArray[2] //String? --> "3" let arrIndex4 = mutableArray[mutableArray.index(before: 4)] //String? --> "four" let arrIndex5 = mutableArray.last //String? --> "5" //Dictionary 取值 let value1 = mutableDict["Animal1"] //String? --> "Dog" let keysArray = [String](mutableDict.keys) //["Animal1", "Animal3", "Animal2"] let valuesArray = [String](mutableDict.values)//["Dog", "Mouse", "Cat"]
Set无序所以无法根据下标和Key去取值,控制语句时候讲解如何遍历Array, Set和Dictionary。
增删改:
var mutableArray = ["1", "two", "3", "four", "5"] var mutableSet = ["北京", "上海", "广州", "深圳", "天津"] var mutableDict = ["Animal1":"Dog", "Animal2":"Cat", "Animal3":"Mouse"] //数组 let constArray = ["9999", "8888"] //追加一个元素 --> ["1", "two", "3", "four", "5", "7777"] /** *API:public mutating func append(_ newElement: Element) */ mutableArray.append("7777") //追加一个数组里面的元素 ["1", "two", "3", "four", "5", "7777", "9999", "8888"] /** *API:+=< C, += C */ mutableArray += constArray //插入元素"sssw",到index = 2的位置(下标从0开始算起)--> ["1", "two", "sssw", "3", "four", "5", "7777", "9999", "8888"] /** *API:public mutating func insert(_ newElement: Element, at i: Int) */ mutableArray.insert("sssw", at: 2) //删除index = 3 的的元素,API将被删除的元素 --> ["1", "sssw", "3", "four", "5", "7777", "9999", "8888"] , moveOject : "two" /** *API:public mutating func remove(at index: Int) -> Element */ let moveOjbect = mutableArray.remove(at: 1) //删除第一个元素 -->["sssw", "3", "four", "5", "7777", "9999", "8888"] /** *API:public mutating func removeFirst() -> Element */ mutableArray.removeFirst() //删除最后一个元素 --> ["sssw", "3", "four", "5", "7777", "9999"] /** *API:public mutating func removeLast() -> Element */ mutableArray.removeLast() //删除所有元素 --> /** *API:public mutating func removeAll(keepingCapacity keepCapacity: Bool = default) */ mutableArray.removeAll() //其它API 数组 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] var numberArray = Array(1...10) //数组中最大值 --> 10 (字符串按照字符在Ascii码中的排序, 如有中文按拼音首字母排序) /** *API:public func max() -> Element? */ let max = numberArray.max() //数组中最小值 --> 1 /** *API:public func min() -> Element? */ let min = numberArray.min() //一组数求和 --> 55 /** *API:public func reduce<T>(_ initial: T, combine: @noescape (T, Element) throws -> T) rethrows -> T 这是一个泛型的API */ let sum = numberArray.reduce(0, combine: +) //求积 --> 3628800 /** *API:同上 */ let product = numberArray.reduce(1, combine: *) //字符串按照按某一个字符切割成数组 --> ["let", "us", "learn", "swift"] /** *API:public func components(separatedBy: CharacterSet) -> [String] */ var str = "let us learn swift" var words = str.components(separatedBy: " ") //数字按照某一个字符拼接成字符串 --> letuslearnswift /** *API:public func joined(separator: CharacterSet) -> String */ str = words.joined(separator: "") //Set //增加元素 //无条件地将给定的元素"长沙"插入到集合中 /** *API:public mutating func update(with newMember: Element) -> Element? */ mutableSet.update(with: "长沙") //插入一个"武汉" --> ["北京", "上海", "武汉", "广州", "深圳", "天津", "郑州", "长沙"] /** *API:public mutating func insert(_ newMember: Element) -> (inserted: Bool, memberAfterInsert: Element) */ mutableSet.insert("武汉") //删除元素 //根据下标删除 --> 返回被删除的元素"北京" , 剩下的元素是["武汉", "长沙", "郑州", "上海", "广州", "深圳", "天津"] /** *API:public mutating func remove(_ member: Element) -> Element? */ mutableSet.remove("北京") //根据SetIndex删除 --> ["武汉", "长沙", "上海", "广州", "深圳", "天津"] /** *API:public mutating func remove(at position: SetIndex<Element>) -> Element */ let setIndex = mutableSet.index(mutableSet.startIndex , offsetBy: 2) mutableSet.remove(at: setIndex) //包含,交差并补 //判断是否包含某个元素 --> true /** *API:public func contains(_ member: Element) -> Bool */ let result = mutableSet.contains("长沙") //转排序,升序 --> [1, 2, 3, 4, 8, 9, 10] /** *API:public func sorted() -> [Element] */ var numberSet : Set = [1, 3, 4, 2, 10, 9, 8] let setToArray = numberSet.sorted() //交集 intersect //当前的mutableSet = ["深圳", "天津", "郑州", "长沙"] /** *API:public mutating func formIntersection<S : Sequence where S.Iterator.Element == Element>(_ other: S) 删除不相同的元素 --> ["广州", "深圳"] */ let neighbors = ["北京", "上海", "广州", "深圳"] mutableSet.formIntersection(neighbors) //差集 subtract //当前的mutableSet = ["广州", "深圳"] /** *API:public mutating func subtract<S : Sequence where S.Iterator.Element == Element>(_ other: S) 删除相同的元素 --> ["广州", "深圳"] */ mutableSet.subtract(neighbors) //并集 union //当前的mutableSet = [] /** *API:public func union<S : Sequence where S.Iterator.Element == Element>(_ other: S) -> Set<Element> 返回两者都有的元素 -->["广州", "北京", "上海", "深圳"] */ let new = mutableSet.union(neighbors) //补集 exclusive //当前的mutableSet = [] /** *API:public func symmetricDifference<S : Sequence where S.Iterator.Element == Element>(_ other: S) -> Set<Element> 返回一个新的集合,并且原集合是否存在这些元素 -->["广州", "北京", "上海", "深圳"] */ let new1 = mutableSet.symmetricDifference(neighbors) //其它用法 let set1 : Set = [1,2,3,4,5] let set2 : Set = [4,5,6,7,8] let set3 : Set = [1,2,3,4,5,4,5,6,7,8] let set4 : Set = [5,2,3,4,1] let set5 : Set = [10,11,12] //子集: isSubsetOf(可以相等), 严格子集isStrictSubsetOf /** *API: 1.public func isSubset(of other: Set<Element>) -> Bool 2.public func isStrictSubset(of other: Set<Element>) -> Bool 描述: 1.返回一个Bool判断是否是子集 2.返回一个Bool判断是否是真子集 */ let result1 = set1.isSubset(of: set4) let result2 = set1.isStrictSubset(of: set3) //父集: isSupersetOf(可以相等), 严格父集isStrictSuperSetOf /** *API: 1.public func isSuperset(of other: Set<Element>) -> Bool 2.public func isStrictSuperset(of other: Set<Element>) -> Bool 描述: 1.返回一个Bool判断是否是父集 2.返回一个Bool判断是否是真父集 */ let result3 = set1.isSuperset(of: set4) let result4 = set3.isStrictSuperset(of: set1) //无交集: isDisjointWith /** *API:public func isDisjoint(with other: Set<Element>) -> Bool 是否存在交集 */ set1.isDisjoint(with: set5) set1.isDisjoint(with: set2) //dictionary 增加键值对 //增加 Animal4 : Monkey /** *API: public mutating func updateValue(_ value: Value, forKey key: Key) -> Value? 用于更新Dictionary中的键值对,如果存在相同的键,则更新键对应的值,返回被更新的值;反之,插入新的键值对,返回值为nil ["Animal3": "Mouse", "Animal1": "Dog", "Animal4": "Monkey", "Animal2": "Cat"] */ let value = mutableDict.updateValue("Monkey", forKey: "Animal4") //删除键值对 /** *API: public mutating func removeValue(forKey key: Key) -> Value? 根据键去删除,相对应的键值对,返回被删除的值 ["Animal4": "Monkey", "Animal2": "Cat", "Animal3": "Mouse"] */ let result = mutableDict.removeValue(forKey: "Animal1") /** *API: public mutating func removeAll(keepCapacity keepCapacity: Bool = default) 删除所有的键值对,无返回值。 */ mutableDict.removeAll()
总结
Array和Dictionary可以改变其的内容,对数据进行临时的持有。
下一篇讲解一下,常规开发中,特殊的String,Array, Dictionary与其它类型的转换。
相关文章推荐
- Swift 易忽略的笔记 3): Array & Dictionary
- swift3.0集合类型(Array,Set,Dictionary)
- Swift中文教程 -- 集合类型(Array,Dictionary)
- Swift学习之十一:数组与字典(Array and Dictionary are collection types)
- 侯捷STL学习(七)--深度探索vector&&array
- Swift中 String、Array、Set、Dictionary的遍历方法
- OC 运用Dictionary & Array 实现省市区分类
- Swift 3.0之后的Array用法记录以及循环遍历知识点
- Swift3 - String 字符串、Array 数组、Dictionary 字典的使用
- Swift中级学习&nbsp;3&nbsp;字典DIctionary
- swift 学习计划(一)Array 数组、Dictionary 字典
- iOS -Swift 3.0 -Array(数组与可变数组相关属性及用法)
- Swift学习之十一:数组与字典(Array and Dictionary are collection types)
- swift-array-dictionary
- swift练习-String、Array、Dictionary、Set
- Swift4.0新特性之String、Array和Dictionary
- swift3新路程(4)数组和字典(array/dictionary)
- Xcode 8.0 新特性 & Swift 3.0 增加的变动
- swift之数组(Array)、集合(Set)、字典(Dictionary)
- Swift中创建Array和Dictionary的初始化