Swift入坑系列—集合类型


  • 数组(Arrays)
  • 字典(Dictionaries)

数组(Arrays)

在OC里面,NSArray和NSMutableArray这两个类可以存储任意类型的对象,并且不提供所返回对象的任何特别信息。
在Swift中,数据值被存入某个数组之前类型必须明确。方法是通过显式的类型标注或者类型推断,而且不是必须是class类型。

//定义了一个存储 字符串类型 的可变数组('var'字段修饰)
var shoppingList: [String] = ["Eggs", "Milk"]

//定义了一个存储 字符串类型 的不可变数组('let'字段修饰)
let peopleList: [String] = ["Danny", "Mike", "Johnnie"]

Note:
当然你也可以省略类型标注,因为Swift可以根据你的内容推断出正确的类型,如下面的代码。

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

创建并构造数组

//创建一个整型空数组
var array1 = [Int]()

//创建一个特定大小,并且所有数据都为默认的整型数组
var array2 = [Int](count: 3, repeatedValue:1)

//创建一个特定大小,并且数据类型为默认的推断为浮点型的数组
var array3 = [](count: 3, repeatedValue:2.5)

数组的增删改查

  1. 增(插入数据)

    Swift中往数组里面插入数据有多种方式:
    1)append()方法

    shoppingList.append("Flour")
    

    2)insert(atIndex:)方法

    shoppingList.insert("Maple Syrup", atIndex: 0)
    

    3)+=赋值运算符

    shoppingList += ["Baking Powder"]
    
  2. 删(删除数据)

    通过removeAtIndex()方法移除指定位置的数据项。这个方法把数组在特定索引值中存储的数据项移除并且返回这个被移除的数据项(返回的数据项如果不用的时候可以无视):

    let mapleSyrup = shoppingList.removeAtIndex(0)
    

    通过removeLast()方法可以移除最后一项数据项

    let apples = shoppingList.removeLast()
    
  3. 改(更新数据)

    //通过指定某一项更新数据项
    shoppingList[0] = "Six eggs"
    
    //通过区间更新区间内数据项
    shoppingList[4...6] = ["Bananas", "Apples"]
    

    Note:
    我们不能使用下标语法在数组尾部添加新项。如果我们试着用这种方法对索引越界的数据进行检索或者设置新值的操作,我们会引发一个运行期错误。我们可以使用索引值和数组的count属性进行比较来在使用某个索引之前先检验是否有效。除了当count等于 0 时(说明这是个空数组),最大索引值一直是count - 1,因为数组都是零起索引

  4. 查(访问数据)

    //获取第0项数据并赋值给变量firstItem
    var firstItem = shoppingList[0]
    
    //获取某个区间的数据项并赋值给另外一个数值
    let tempArr = shoppingList[1...2]
    

数组的遍历

通过for-in循环遍历数组中的数据项:
【方式一】

let array = ["Danny", "Johnnie", "Mike"]
//遍历数组数据项
for item in array {
    print(item)
}
控制台打印:
Danny
Johnnie
Mike

【方式二】

let array = ["Danny", "Johnnie", "Mike"]
//遍历数组数据项
for (idx, value) in array.enumerate() {
    print("idx:\(idx)  value:\(value)")
}
控制台打印:
idx:0  value:Danny
idx:1  value:Johnnie
idx:2  value:Mike

字典(Dictionaries)

创建字典字面量

OC里面,字典字面量的格式是:@{@"key" : @"value"},而Swift里面,字典字面量以及数组字面量均使用中括号[]包住。格式为:[key 1: value 1, key 2: value 2, key 3: value 3]

//创建一个
var airports: [String:String] = ["TYO": "Tokyo", "DUB": "Dublin"]
//创建一个键为String,值为Int的空字典
var dic1 = Dictionary<String, Int>()

字典的增删改查

  1. 增(插入数据)
    在字典中使用下标语法来添加新的数据项。可以使用一个合适类型的 key 作为下标索引,并且分配新的合适类型的值:

    airports["LHR"] = "London"
    
  2. 删(删除数据)

    通过removeValueForKey()方法在字典中移除键值对。这个方法在键值对存在的情况下会移除该键值对并且返回被移除的value或者在没有值的情况下返回nil

    //通过键值“DUB”移除对应的值
    let removedValue = airports.removeValueForKey("DUB")
    
  3. 改(更新数据)
    通过使用下标语法来改变特定键对应的值:

    //使用下标语法来改变特定键对应的值
    airports["LHR"] = "London Heathrow"
    

    也可以通过updateValue(forKey:)方法设置或者更新特定键对应的值。这个方法还会返回更新值之前的原值或者nil,方便我们检查更新是否成功:

    //通过“DUB”键将旧值更新为“Dublin Internation”
    let oldValue = airports.updateValue("Dublin Internation", forKey: "DUB")
    
  4. 查(访问数据)
    使用下标语法来在字典中检索特定键对应的值。由于使用一个没有值的键这种情况是有可能发生的,可选类型返回这个键存在的相关值,否则就返回nil

    if let airportName = airports["DUB"] {
        print("DUB键对应的值为: \(airportName).")
    

} else {
print("DUB键没有对应的值")
}
```

    控制台打印:
    DUB键对应的值为: Dublin Internation.

字典的遍历

【方式一】
通过for-in循环遍历某个字典中的键值对。每一个字典中的数据项都由(key, value)元组形式返回,并且我们可以使用临时常量或者变量来分解这些元组:

//遍历字典对应的键值对
for (key, value) in airports {
    print("\(key): \(value)")
}
控制台打印:
TYO: Tokyo
LHR: London Heathrow

【方式二】
我们也可以通过访问它的keys或者values属性检索一个字典所有的键、值:

//遍历字典所有键
for key in airports.keys {
    print("该字典的键:\(key)")
}
//遍历字典所有值
for value in airports.values {
    print("该字典的值:\(value)")
}
控制台打印:
该字典的键:LHR
该字典的键:TYO
该字典的值:London Heathrow
该字典的值:Tokyo

Note:
当你想要将字典的键、值分别存起来的话,可以使用数组的APIArray()进行存储

//将字典的所有键存进keys数组中
let keys = Array(airports.keys)

//将字典的所有值存进values数组中
let values = Array(airports.values)

总结

目前本人就先简单的介绍数组、字典的一些简单的使用,后期会不断的完善这篇文章。再一次感谢您花费时间阅读这篇文章!


微博: @Danny_吕昌辉
博客: SuperDanny

2015 年 07月 27日

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

推荐阅读更多精彩内容