DAY9:Collection Types & Closures

另外一种下标的方法也可以修改特定的的键对应的值,但是该方法返回的值是更新前的值:

var airport:[String: String] = ["YYZ":"Toronto Pearson","DUB":"Dublin"]
if let oldValue = airport.updateValue("Dublin", forKey: "DUB"){
    print("The old value for DUB was \(oldValue).")
}

下面的例子说明women可以通过下标语法表示这样一种场景,我们通过下标语法来获取到一个可选值,如果没有获取到则返回一个nil值

if let airportName = airport["hah"]{
    print("The name of the airport is \(airportName)")
}else{
    print("That airport is not in the airports dictionary.")
}

因为没有hah这个键所对应的值,所以if判断获取的是一个nil值,打印That airport is not in the airports dictionary.我们还可以通过下表语法来从下标语法中新增一个键值对,通过给键的值赋值nil来从字典中移除一个键值对

airport["nihao"]="jiangyaqi"    //新增键值对nihao:jiangyaqi
airport["nihao"]=nil            //删除键值对nihao:jiangyaqi

此外可以通过removeValueForKey方法来从字典中移除键值对,这个方法会对兼职对存在的情况下移除键值对并返回该键值对,键值对不存在的情况下返回nil

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

打印出The removed airport's name is Dublin

字典的遍历

我们可以用for-in循环来遍历字典中得键值对,每个字典的数据都以(key,value)元组的形式返回,我们还可以使用临时常量或者变量来分解这些元组

for (aiportCode,airportName) in airport{
    print("\(aiportCode):\(airportName)")
}
//或者我们可以直接访问keys后者values属性
for airportCode in airport.keys{
    print("Airport code: \(airportCode)")
}
for airportName in airport.values{
    print("Airport name: \(airportName)")
}

如果我们只是需要使用某个字典的键值对或者值集合作为某个接受Array实例的API的参数,可以使用keys或者values属性构造一个新数组:

let airportCode = [String](airport.keys)
//构造了一个以airport.keys为值的新数组
let airportNames = [String](airport.values)
//构造了一个以airport.values为值的新数组

Swift的字典是无序的集合,为了以特定的顺序来遍历数组或者键或者值,可以对字典的keys或者values属性使用sort方法

闭包

现在我理解的闭包作用是这样的,就是闭包可以将本来是一个函数的东西,作为参数进行传递。可能现在理解有偏差,以后再看。现在理解swift中得函数就是闭包,apple文档中是这么描述的
闭包有三种形式:

  1. 全局函数是一个有名字但不会捕获任何值的闭包。
  2. 嵌套函数是一个有名字并可以捕获到其封闭函数域内的值的闭包。
  3. 闭包表达式是一个利用轻量级语法所写的,可以捕获其上下文中变量或常量值的匿名闭包。

sort方法

swift标准库提供了sort方法,会根据你提供的用于排序的闭包函数将已知类型数组中得值进行排序,一旦排序完成会返回一个跟原数组大小相同,包含同类型元素且已经正确排序的新数组,原数组不会被修改。sort方法接收一个闭包,该闭包函数需要传入跟数组元素类型相同的两个值,并且返回一个布尔类型的值来表明当排序结束后传入的第一个参数排在第二个参数的前面还是后面,如果第一个参数出现在第二个参数的前面,排序闭包函数不要返回true,反之返回false。

我们命名了一个数组names

let names = ["Chirs","Alex","Ewa","Barry","Daniella"]

提供一个闭包函数的一种方式是撰写一个符合类型要求的普通函数,并将其作为sort方法的参数传入

func backwards(s1: String, s2: String) -> Bool {
    return s1 > s2
}
//对于字符串来说,大于表示的十按照字母顺序较晚的出现
var reversed = names.sort(backwards)
// reversed 为 ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

闭包表达式语法(Closure Expression Syntax)

闭包表达式的语法一般如下:

{(parameters) -> returnType in 
    statements
}

下面的例子展示了之前函数对应的闭包表达式版本的代码,闭包的函数体部分由关键字in引入,该关键字表示闭包的参数和返回值类型的定义已经完成,闭包函数体将要开始:

reversed = names.sort({ (s1: String, s2: String) -> Bool in
    return s1 > s2
})

这个闭包的函数体部分很短,我们可以写成一行:

reversed = names.sort({ (s1: String, s2: String) -> Bool in return s1 > s2})

这个例子中得sort方法的整体调用保持不变化,一对圆括号包裹住了方法的整个参数,然而参数现在变成了内联闭包

根据上下文推断类型(Inferring Type From Context)

实际上任何情况下,通过内联闭包表达式构造的闭包作为参数传递给函数或者方法的时,够可以推断除闭包的参数和返回值类型,也就是说闭包作为函数或者方法的参数的时候,我们几乎不需要用完整地格式构造内联闭包。

reversed = names.sort(s1 : s2 in return s1 > s2)

单行表达式闭包隐式返回(Implicit Return From Single-Expression Closures)

单行表达式闭包可以通过省略return关键字来隐式返回单行表达式的结果,sort方法的第二个参数函数类型明确了闭包必须返回一个Bool类型的值,因为闭包函数体只包含了一个单一的表达式s1 > s2,该表达式返回Bool类型值,因此这里没有歧义,return关键字可以省略:

reversed = names.sort({s1, s2 in s1 > s2})

参数名称缩写(Shortthand Argument Names)

Swift自动为内联函数闭包提供了参数名称缩写的功能,可以直接通过$0,$1,$2来顺序调用闭包的参数,以此类推。我们在闭包表达式中使用了参数名称的缩写,我们就可以在闭包参数列表中省略对其的定义,并且对应的参数名称缩写的类型会通过函数类型进行判断,所以in关键字也可以省略:

reversed = names.sort({ $0 > $1 })
//$0和1,表示了闭包中第一个和第二个String类型的参数

运算符函数(Operator Functions)

swift中String类型定义了关于(>)大于号的字符串实现,其作为一个函数接收两个String并且返回一个Bool类型的值,这个正好和sort方法中得第二个参数需要的函数类型相符合。因此可以写成:

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

推荐阅读更多精彩内容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,815评论 1 10
  • 闭包是功能性自包含模块,可以在代码中被传递和使用。Swift中的闭包与 C 和 Objective-C中的 blo...
    AirZilong阅读 349评论 0 2
  • RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一...
    ikin阅读 2,097评论 0 5
  • 小公子 ——丁茉莉 暑假到了,给小朋友推荐一本书《小公子》...
    丁茉莉阅读 757评论 0 2
  • 他听城里的姐姐讲,站在上面,看得见她家里的窗户,窗户上贴着各种各样好看的卡通娃娃。 但房顶上爸爸用砖头垒的扶手...
    何了了阅读 345评论 0 0