swift简单总结(十二)—— 集合类型之数组

版本记录

版本号 时间
V1.0 2017.07.25

前言

我是swift2.0的时候开始接触的,记得那时候还不是很稳定,公司的项目也都是用oc做的,并不对swift很重视,我自己学了一段时间,到现在swift3.0+已经出来了,自己平时也不写,忘记的也差不多了,正好项目这段时间已经上线了,不是很忙,我就可以每天总结一点了,希望对自己对大家有所帮助。在总结的时候我会对比oc进行说明,有代码的我会给出相关比对代码。
1. swift简单总结(一)—— 数据简单值和类型转换
2. swift简单总结(二)—— 简单值和控制流
3. swift简单总结(三)—— 循环控制和函数
4. swift简单总结(四)—— 函数和类
5. swift简单总结(五)—— 枚举和结构体
6. swift简单总结(六)—— 协议扩展与泛型
7. swift简单总结(七)—— 数据类型
8. swift简单总结(八)—— 别名、布尔值与元组
9. swift简单总结(九)—— 可选值和断言
10. swift简单总结(十)—— 运算符
11. swift简单总结(十一)—— 字符串和字符

集合类型

swiftoc一样,都有集合类型,在oc中集合类型有:

  • 数组(NSArray/NSMutableArray
  • 字典 (NSDictionary/NSMutableDictionary
  • 集合(NSSet)

他们的优缺点就不多说了,很简单的了。在swift中同样有数字和字典。下面就说下这几种类型。swift中数组和字典中存储的类型必须完全明确,不能把不正确的数据类型存入其中,这也说明了我们对从数组中取值可以极大放心了。

注意swift的数组结构在被声明成常亮或者被传入函数与方法中时会相对于其他类型展现出不同的特性,这个以后会详加阐述。


数组

数组使用有序列表存储同一类型的多个值,相同的值可以多次出现在一个数组的不同位置上,swiftoc中数组的定义前几篇有所涉及,这里就不多说了。这里有几点要注意:

  • oc中,NSArrayNSMutableArray可以存储任意类型的对象,不用在数组定义的时候就指定存储类型,并且不提供所返回对象的任何特别的信息。
  • swift中,数据值被存入某一个数组之前,类型必须明确,方式就是通过显示的类型标注或者类型推断,而且不是必须是class类型,整型数据也可以。例如:我们创建Int类型的数组,就不能往里面添加任何和该类型不同的数据,swift中的数据类型是安全的,包含的类型也必须明确。

1. 数组构造语句

oc中一样,swift中的数据也是使用中括号包含数值,[value1, vaule2, value3]。下面看一下swift中数组的简单定义。

    //数组定义
    var numberArr : [Int] = [1, 2, 3, 4]
    print(numberArr)
    
    var nameStrArr : [String] = ["John", "Smith"]
    print(nameStrArr)

下面看输出结果

[1, 2, 3, 4]
["John", "Smith"]

下面看一下oc中数组的简单定义。

    NSArray *numberArr = @[@(1), @(2), @(3), @(4)];
    NSLog(@"%@",numberArr);
    
    NSArray *nameStrArr = @[@"John", @"Smith"];
    NSLog(@"%@",nameStrArr);

下面看输出结果

2017-07-25 10:56:33.954628+0800 JJOC[5185:1639082] (
    1,
    2,
    3,
    4
)

2017-07-25 10:56:33.954719+0800 JJOC[5185:1639082] (
    John,
    Smith
)

这里需要说一下:swift中用var表示可变数组,而oc中用NSMutableArray表示可变数组。由于swift有类型推断机制,所以初始化不指定类型,也会被推断出来,所以上面的代码也可以这么写。

    //数组定义
    var numberArr = [1, 2, 3, 4]
    print(numberArr)
    
    var nameStrArr = ["John", "Smith"]
    print(nameStrArr)

2. 访问和修改数组

访问可以访问可变和不可变数组,修改数组则只能修改可变数组。

通过count属性获取数组的数据量

先看swift

    //数组定义
    var nameStrArr : [String] = ["John", "Smith"]
    print(nameStrArr)
    print(nameStrArr.count)

下面看输出结果

["John", "Smith"]
2

接着看oc

    NSArray *nameStrArr = @[@"John", @"Smith"];
    NSLog(@"%@",nameStrArr);
    NSLog(@"%d",nameStrArr.count);

下面看输出结果

2017-07-25 11:12:45.626938+0800 JJOC[5193:1640931] (
    John,
    Smith
)
2017-07-25 11:12:45.626985+0800 JJOC[5193:1640931] 2

检查数组是否为空

先看swift,有个属性isEmpty判断是否为空。

    var nameStrArr : [String] = ["John", "Smith"]
    print(nameStrArr)
    print(nameStrArr.count)
    if nameStrArr.isEmpty {
        print("YES")
    }
    else {
        print("NO")
    }

下面看输出结果

["John", "Smith"]
2
NO

再看oc,就只能判断数组中元素个数了。

    NSArray *nameStrArr = @[@"John", @"Smith"];
    if (nameStrArr.count == 0) {
        NSLog(@"YES");
    }
    else {
        NSLog(@"NO");
    }

下面看输出结果

2017-07-25 11:18:47.220330+0800 JJOC[5201:1642480] NO

增加数组中的数据

swift中可以通过+以及append方法来增加数组中的数据。下面看代码。

    var nameStrArr : [String] = ["John", "Smith"]
    nameStrArr += ["Green"]
    print(nameStrArr)
    
    nameStrArr.append("David")
    print(nameStrArr)

下面看输出结果

["John", "Smith", "Green"]
["John", "Smith", "Green", "David"]

下面看oc中,只能NSMutableArray可以增加减少数据,增加可以用addObject:方法下面我们看代码。

    NSArray *nameStrArr = @[@"John", @"Smith"];
    NSMutableArray *arrM = [NSMutableArray arrayWithArray:nameStrArr];
    [arrM addObject:@"Green"];
    NSLog(@"%@",arrM);
    
    [arrM addObjectsFromArray:nameStrArr];
    NSLog(@"%@",arrM);

下面看输出结果

2017-07-25 11:28:52.907931+0800 JJOC[5212:1646297] (
    John,
    Smith,
    Green
)

2017-07-25 11:28:52.908002+0800 JJOC[5212:1646297] (
    John,
    Smith,
    Green,
    John,
    Smith
)

通过索引找到和更改数据

这个swiftoc都是一样的,大家记住索引是从0开始不是从1开始的就好了,就会少出现很多错误,典型的就是数组越界。

swift可以用过下标改变一系列的数据

下面看这个例子

    var nameStrArr : [String] = ["John", "Smith"]
    nameStrArr[0...1] = ["Green", "Rose", "Rechide", "Adail"]
    print(nameStrArr)

下面看输出结果


["Green", "Rose", "Rechide", "Adail"]

这个是oc没有的语法。

注意: 不能用下标语法在数组尾部添加新项,可能引起数组越界,可以使用索引值和数组的count属性进行比较来在使用某个索引之前先检验有效性。

插入数据

我们先看一下 swift中插入数据的情况。

    var nameStrArr : [String] = ["John", "Smith"]
    nameStrArr.insert("Lilei", at: 0)
    print(nameStrArr)

下面看结果

["Lilei", "John", "Smith"]

下面我们看oc中的方法

    NSArray *nameStrArr = @[@"John", @"Smith"];
    NSMutableArray *arrM = [NSMutableArray arrayWithArray:nameStrArr];
    [arrM insertObject:@"Green" atIndex:0];
    NSLog(@"%@",arrM);

下面看输出结果

["Lilei", "John", "Smith"]

移除数组中的某一项

下面我们看一下swift中移除数组中的某一项。ocswift中都有remove object at index类似方法,移除某一项,也可以调用removeFirstremoveLastremoveAll等方法移除特定的数据,很简单和方便。

    var nameStrArr : [String] = ["John", "Smith", "Lilei"]
    let firstObj = nameStrArr .remove(at: 0)
    print(nameStrArr)
        
    nameStrArr .removeLast()
    print(nameStrArr)

下面看输出结果

["Smith", "Lilei"]
["Smith"]

这里注意可以返回移除的数据,firstObj就是返回的数据,如果不需要,可以不用变量去接收它。

下面我们看一下oc

    NSArray *nameStrArr = @[@"John", @"Smith", @"Lilei"];
    NSMutableArray *arrM = [NSMutableArray arrayWithArray:nameStrArr];
    [arrM removeObjectAtIndex:0];
    NSLog(@"%@",arrM);
    [arrM removeLastObject];
    NSLog(@"%@",arrM);

下面看输出结果

2017-07-25 11:52:16.828288+0800 JJOC[5230:1649832] (
    Smith,
    Lilei
)

2017-07-25 11:52:16.828355+0800 JJOC[5230:1649832] (
    Smith
)

创建指定大小的数组

下面我们就看一下创建指定大小的数组,先看oc

    NSMutableArray *arrM = [NSMutableArray arrayWithCapacity:5];
    [arrM addObject:@"Lilei"];
    NSLog(@"%@",arrM);

下面看输出结果

2017-07-25 12:19:11.844777+0800 JJOC[5243:1653454] (
    Lilei
)

下面我们看一下swift中的用法。

    var numberArr = [Double](repeatElement(0.0, count: 3))
    print(numberArr)
    
    var numberArr1 = [Double](repeatElement(1.0, count: 3))
    print(numberArr1)
    
    var wholeArr = numberArr1 + numberArr
    print(wholeArr)

下面看输出结果

[0.0, 0.0, 0.0]
[1.0, 1.0, 1.0]
[1.0, 1.0, 1.0, 0.0, 0.0, 0.0]

由于swift中有类型推断,所以这里的[Double]可以省略。

3. 数组的遍历

数组的遍历总是工程中需要的逻辑处理,通过遍历,在数组中找到我们感兴趣的数据。数组的遍历用两种方法:

  • for - in遍历,这个如果对索引不感兴趣可以使用
  • enumerated函数,返回索引和对应数组值

先看一下swift中。

    var nameStrArr : [String] = ["John", "Smith", "Lilei"]
        
    //for - in 遍历
    for name in nameStrArr {
        print(name)
    }
        
    print("--------")
    
    //enumerate 遍历
    for (index, item) in nameStrArr.enumerated(){
        print("\(index): \(item)")
    }

下面看输出结果

John
Smith
Lilei
--------
0: John
1: Smith
2: Lilei

下面我们就看一下,oc中的例子。

    NSArray *nameStrArr = @[@"John", @"Smith", @"Lilei"];
    
    //for - in遍历
    for (NSString *name in nameStrArr) {
        NSLog(@"%@",name);
    }
    
    NSLog(@"---------");
    
    //enumerate遍历
    [nameStrArr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
         NSLog(@"%@",obj);
    }];

下面看输出结果

2017-07-25 12:02:00.962119+0800 JJOC[5235:1650962] John
2017-07-25 12:02:00.962177+0800 JJOC[5235:1650962] Smith
2017-07-25 12:02:00.962192+0800 JJOC[5235:1650962] Lilei
2017-07-25 12:02:00.962204+0800 JJOC[5235:1650962] ---------
2017-07-25 12:02:00.962224+0800 JJOC[5235:1650962] John
2017-07-25 12:02:00.962238+0800 JJOC[5235:1650962] Smith
2017-07-25 12:02:00.962250+0800 JJOC[5235:1650962] Lilei

后记

未完,待续~~~~

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

推荐阅读更多精彩内容