Swift3.0之集合类型

一、数组
通过初始化语法创建一个特定类型的空数组

var someInts = [Int]()
print("someInts is of type [Int] with\(someInts.count) items")

如果上文已提供类型信息,像函数参数或者已有类型的常变量,可以使用空数组字面量来创建空数组,写作[]

someInts.append(3)
// someInts now contains 1 value of type Int
someInts = []
// someInts is now an empty array, but is still of type [Int]

创建一个带默认值的数组
Swift提供初始化器来创建一种所有值为同一个默认值的特定大小的数组。通过repeating:来传递一个默认值,通过count:来传递这个值出现的次数。如下:

var threeDoubles = Array(repeating:0.0,count:3)
// threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]

两数组合并组成新数组
使用+

var anotherThreeDoubles = Array(repeating: 2.5, count: 3)
// anotherThreeDoubles is of type [Double], and equals [2.5, 2.5, 2.5]
var sixDoubles = threeDoubles + anotherThreeDoubles
// sixDoubles is inferred as [Double], and equals [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]

通过数组字面量来创建一个数组
如下格式:
[value 1, value2, value3]

var shoppingList: [String] = ["Eggs", "Milk"]
// shoppingList has been initialized with two initial items

一般你不用写数组的类型,因为数组字面量中的所有值都为同种类型,Swift可以自动算出正确地类型。

var shoppingList = ["Eggs", "Milk"]

访问和修改数组
可以通过其方法和属性来访问修改一个数组,或者使用下标语法
(1) 数组item的数目,使用count属性

print("The shopping list contains \(shoppingList.count) items.")
// Prints "The shopping list contains 2 items."

(2)使用isEmpty来判断数组是否为空
(3)通过append(_:)的方式来添加新的item

shoppingList.append("Flour")
// shoppingList now contains 3 items, and someone is making pancakes

(4)检索数组的值,通过下标的方式

var firstItem = shoppingList[0]
// firstItem is equal to "Eggs"

注意:swift中数组下标总是以0开头的
(5)可以通过下标语法来直接修改值

shoppingList[0] = "Six eggs"
// the first item in the list is now equal to "Six eggs" rather than "Eggs"

(6)可以通过下标来改变一个范围的值

shoppingList[4...6] = ["Bananas", "Apples"]
// shoppingList now contains 6 items

注意:不能使用下标来拼接一个新的item到数组的最后
(7)在特定的索引下,插入一个数组,使用 insert(_:at:)方法

shoppingList.insert("Maple Syrup", at: 0)
// shoppingList now contains 7 items
// "Maple Syrup" is now the first item in the list

(8)使用remove(at:)来移除item,返回被移除的item

let mapleSyrup = shoppingList.remove(at: 0)
// the item that was at index 0 has just been removed
// shoppingList now contains 6 items, and no Maple Syrup
// the mapleSyrup constant is now equal to the removed "Maple Syrup" string

注意:访问超出边界会报错
(9)移除数组最后一个item,最好使用removeLast(),省去查找数组个数的属性,同样,removeLast返回被移除的item

let apples = shoppingList.removeLast()

(10)遍历一个数组

for item in shoppingList {
print(item)
}

(11)如果你需要每一个item的整形指数以及值,可以使用enumerated()来遍历数组。那么返回的值为指数和对应的值组成的元组。

for (index, value) in shoppingList.enumerated() {
print("Item \(index + 1): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas

二、集合

存储一些同一类型没有顺序的值,并且每个item只出现一次。
为了能让类型储存在集合当中,它必须是可哈希的——就是说类型必须提供计算它自身哈希值的方法。
Swift 的合集类型写做 Set<Element>,这里的 Element是集合要储存的类型。不同与数组,集合没有等价的简写。

初始化创建一个空的集合

 var letters = Set<Character>()

如果上文已提供类型信息,通过空的数组字面量创建一个空的集合

letters.insert("a")
// letters now contains 1 value of type Character
letters = []
// letters is now an empty set, but is still of type Set<Character>

使用数组字面量初始化一个数组,可以作为一个速成的方式写进更多的值

var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
// favoriteGenres has been initialized with three initial items

一个set类型不能仅仅通过数组字面量来推出,所以set必须能明确的声明,但是如果数组字面量包含的类型与集合初始化的类型一致,集合内的类型不用写出

var favoriteGenres: Set = ["Rock", "Classical", "Hip hop"]

访问和修改一个集合
(1)count, isEmpty属性同上
(2)添加item, insert(_:)

favoriteGenres.insert("Jazz")

(3)remove(_:)移除item,返回被移除的值,如果不包含这个item,则返回nil。所有item可以被removeAll()移除

if let removedGenre = favoriteGenres.remove("Rock") {
print("\(removedGenre)? I'm over it.")
} else {
print("I never much cared for that.")
}
// Prints "Rock? I'm over it."

(4)检测是否包含一个item,使用contains(_:)

if favoriteGenres.contains("Funk") {
print("I get up on the good foot.")
} else {
print("It's too funky in here.")
}
// Prints "It's too funky in here."

遍历合集
for - in . Set 如果按特定的顺序,使用 sorted()方法。

for genre in favoriteGenres.sorted() {
print("\(genre)")
}

集合操作

集合

(1)使用 intersection(:)找出两个集合共有的部分并成为新的集合
(2)使用symmetricDifference(
:)找出连个集合各自用的值,不是共有的
(3)union(:)合并两个集合
(4)subtracting(
:)元素不在指定的集合

let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits.intersection(evenDigits).sorted()
// []
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]

从属和等价关系
(1)使用= 来判断两个集合是否完全包含相同元素
(2)isSubset(0f:)来判断子集合
(3)isSuperset(of:)判断父集合
(4)isStrictSubset(of:) 或者 isStrictSuperset(of:)来判断是否一个集合完全是子集或父集合,而不是等同于一个特定的集合
(5)isDisjoint(with:)来判断是否有相同元素

let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]
houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true

三、字典
创建空字典,如果已知道类型,可写成[:]

var namesOfIntegers = [Int: String]()
namesOfIntegers[16] = "sixteen"
// namesOfIntegers now contains 1 key-value pair
namesOfIntegers = [:]
// namesOfIntegers is once again an empty dictionary of type [Int: String]

以字典字面量的形式创建一个字典

var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

和数组一样,如果和初始化的键值类型一致,那么就不用再写相关类型。

var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

访问和修改字典
(1)count和isEmpty属性。
(2)下标脚本给字典添加新元素。使用正确类型的新键作为下标脚本的索引,然后赋值一个正确类型的值

airports["LHR"] = "London"
// the airports dictionary now contains 3 items

同样可以通过key修改Value

airports["LHR"] = "London Heathrow"
// the value for "LHR" has been changed to "London Heathrow"

(3)使用updateValue(:forkey:)来设置或更新一个特定key所对应的值。做完更新后,这个方法返回旧的Value。
updateValue(
:forKey:)方法返回一个字典值类型的可选项值。比如对于储存 String值的字典来说,方法会返回 String?类型的值,或者说“可选的 String”。这个可选项包含了键的旧值如果更新前存在的话,否则就是 nil:

if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
print("The old value for DUB was \(oldValue).")
}
// Prints "The old value for DUB was Dublin."

同样可以使用下标脚本语法来从字典的特点键中取回值。由于可能请求的键没有值,字典的下标脚本返回可选的字典值类型。如果字典包含了请求的键的值,下标脚本就返回一个包含这个键的值的可选项。否则,下标脚本返回 nil :

使用下标脚本语法给一个键赋值 nil来从字典当中移除一个键值对:

airports["APL"] = "Apple International"
// "Apple International" is not the real airport for APL, so delete it
airports["APL"] = nil
// APL has now been removed from the dictionary

使用 removeValueForKey(_:)来从字典里移除键值对。这个方法移除键值对如果他们存在的话,并且返回移除的值,如果值不存在则返回 nil:

if let removedValue = airports.removeValueForKey("DUB") {
    print("The removed airport's name is \(removedValue).")
} else {
    print("The airports dictionary does not contain a value for DUB.")
}
// prints "The removed airport's name is Dublin Airport."

遍历字典
使用 for-in循环来遍历字典的键值对。字典中的每一个元素返回为 (key, value)元组,你可以解开元组成员到临时的常量或者变量作为遍历的一部分:

for (airportCode, airportName) in airports {
    print("\(airportCode): \(airportName)")
}
// YYZ: Toronto Pearson
// LHR: London Heathrow

同样可以通过访问字典的 keys和 values属性来取回可遍历的字典的键或值的集合:

for airportCode in airports.keys {
    print("Airport code: \(airportCode)")
}
// Airport code: YYZ
// Airport code: LHR

for airportName in airports.values {
    print("Airport name: \(airportName)")
}
// Airport name: Toronto Pearson
// Airport name: London Heathrow

需要和接收 Array实例的 API 一起使用字典的键或值,就用 keys或 values属性来初始化一个新数组:

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

推荐阅读更多精彩内容