一、声明和创建数组
swift的声明数组变量有两种语法。
使用泛型语法。数组类型的语法格式为:Array<类型>,此处的尖括号就是泛型语法。
使用简化语法。数组类型的语法格式为:[类型]。
例如,如下代码可用于声明数组变量。
//使用泛型语法声明数组
var myArr : Array<String>
//使用简化语法声明数组
var names : [String]
var nums : [Int]
仅仅声明数组变量还不能使用数组,程序还必须创建数组结构体,并将数组赋值给数组变量才能使用它们。创建数组也有两种方式。
- 使用Array的构造器创建数组
Array的构造体提供了如下3个常用的构造器。
- init():创建一个空数组。
- init(arrayLieral:):以指定的多个元素来创建数组。
- init(count:,repeatedValue:):创建一个包含count个repeatedValue元素的数组。
下面程序为上面定义的3个数组变量创建了对应的数组。
myArr = Array<String>()
//创建一个包含10个“fkit”元素的数组,并将该数组赋值给names变量。
names = [String](count: 10, repeatedValue: "fkit")
//以指定的多个元素创建数组,并将数组赋值为nums变量
nums = [Int](arrayLiteral:12, 20, 30, -9, -29)
- 使用简化语法创建数组
数组的简化语法更加简洁,直接使用方括号列出多个数组值即可。
如下代码使用简化语法创建了数组。
var flowers : [String] = ["a","b","c","d"]
var values = ["1","2","3","e"]
二、使用数组
数组提供了一个只读的count属性,通过这个属性可以方位到数组的长度,一旦获得了数组的长度,就可以通过循环来遍历该数组的每个数组元素。
下面代码师范了输出flowers数组的每个数组元素的值。
for var i = 0; i < flowers.count; i++{
print(flowers[i])
}
除此之外,数组还提供了只读的startIndex和endIndex属性,其中startIndex返回该数组的第一个元素的索引,因此该属性总是返回0;endIndex返回该数组最后一个元素的索引+1,因此该属性的返回值与count属性的返回值相等。例如如下代码:
//访问flowers数组的第一个索引
print(flowers.startIndex)
//访问flowers数组的最后一个索引(实际上返回最后一个元素的索引+1)
print(flowers.endIndex)
三、使用for-in遍历数组
for-in循环遍历数组的语法格式如下:
for element in array{
//element自动迭代访问每个元素
}
在上面语法中,element无须使用let声明,for-in循环将会隐式声明该常量。下面程序示范了如何使用for-in循环来遍历数组元素。
var books:[String] = ["疯狂iOS讲义","疯狂Swift讲义","疯狂Android讲义"]
for book in books{
print(book)
}
当使用for-in循环遍历、访问数组元素时,不允许对循环常量进行赋值,这是因为for-in循环隐式使用let来声明该变量,因为程序不能对循环常量赋值。
四、数组的可变性和数组的修改
添加元素
Array提供了append(_:)方法添加元素,每调用该方法一次,程序就会在数组的最后添加一个元素,数组的长度也会自动加1.
如下代码调用Array的append(_:)方法添加元素。
//使用var定义一个可变数组
var languages = ["Swift"]
//追加一个元素
Languages.append("GO")
languages.append("Lua")
//输出Swift,GO,Lua
print(languages)
print(languages.count)
除了调用append方法添加元素之外,Swift的数组还支持使用“+”执行加法,数组的加法可以添加另一个类型匹配的数组。例如如下代码
languages = languages + ["Ruby"]
//上面代码可简写如下
languages += ["Ruby"]
print(languages)
print(languages.count)
插入元素
Array提供了insert(_:Element,atIndex:Int)方法插入元素。需要注意的是,该方法的第二个参数不能超过数组长度。(可以等于数组长度,此时效果与调用append方法完全相同)。
如下代码调用Array的insert()方法插入元素。
//使用var定义一个可变数组
var languages = ["Swift"]
//插入一个元素
languages.insert["Go",atIndex:0]
//插入一个元素,指定atIndex:2,表明该元素插入数组的最后
languages:insert["Ruby",atIndex:2]
print(languages)
print(languages.count)
- 数组和范围
Array支持在方括号中使用Range,这样既可以一次性地获取多个数组元素,也可一次性对多个数组元素进行赋值。
例如以下代码:
var languages = ["Swift","OC","PHP","Perl","Ruby","Go"]
//获取languages数组中索引为1-4的元素
let subRange = languages[1..<4]
print(subRange)//输出[OC,PHP,Perl]
//将languages数组中索引为2-4的元素替换成"C/C++","Python"
languages[2...4] = ["C/C++","Python"]
print(languages)
//将languages数组中索引为1-2的元素替换成"a","b","c"
//两个元素换成三个元素
languages[1...2] = ["a", "b", "c"]
print(languages)
正如上面代码所看到的,当程序对指定范围的数组元素赋值时,并不需要指定范围包含的元素个数与所赋值的元素个数相同,如果所赋值的元素少于范围内包含的元素个数,程序会自动减少Swift数组的长度;如果所赋值的元素多于范围内包含的元素个数,程序会自动增加Swift数组的长度。
正因为Swift的数组存在这种功能,因此程序可以用过这种方式添加或删除数组元素。例如,如下代码即可清空数组:
languages[0..<languages.count] = []
除此之外,数组还提供了replaceRange(_:With:)方法,该方法可以将数组的中间一段替换为指定的子数组。例如如下程序:
var characters = ["孙悟空","猪八戒","唐僧","牛魔王"]
characters.replaceRange(1...3,with:["黄袍怪"])
print(characters)//输出["孙悟空","黄袍怪"]
- 删除元素
Array提供了如下方法来删除元素。
- popLast()->Element:删除数组的最后一个元素,该方法返回即将删除的元素。
- removeAtIndex(index:Int)->Element:删除指定索引处的元素,该方法返回即将删除的元素。
- removeLast()->Element:删除数组的最后一个元素,该方法返回即将删除的元素。该方法和popLast方法的作用大致相同。
- removeAll(keepCapacity:Bool = false):清空数组。其中keepCapacity参数指定是否保留数组底层的数据缓冲,该参数默认false,即不保留数据缓冲。
如下程序调用了上面方法来删除数组元素。
var languages = ["Swift","OC","PHP","Perl","Ruby","Go"]
//删除索引为2的元素,即PHP
languages.removeAtIndex(2)
//再次删除索引为2的元素,即Perl
languages:removeAtIndex(2)
//删除最后一个元素
languages.removeLast()
//删除所有元素
languages.removeAll()