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

后记

未完,待续~~~~

swift简单总结(十二)—— 集合类型之数组_第1张图片
空山鸟语

你可能感兴趣的:(swift简单总结(十二)—— 集合类型之数组)