妈蛋,真不容易啊,终于要说集合了。哎╮(╯▽╰)╭。这进度太慢了啊!
swift中的集合分好几种,他们统统成为集合类型。还是PHP大发好啊,一个数组类型就搞定所有。
按照可以是否存在相同类型的数据,具体分为,以下:
swift中的数组跟java和c 一样,只能包含相同类型的成员数据,要么全是整型,要么全是字符串,不能几种不同的类型混在一块,要是你想混在一起就得用接下来的字典
类型。
如何申明一个数组呢,和javascript是一样的,用[]表示。但是,我们要申明这个数组是要有变量类型的。所以,要用[类型]来标记。
//先申明
var array1:[String]
//后赋值
array1 = ["ab","cb","ed"]
println(array1) // 打印:[ab, cb, ed]
或者是申明和赋值连着一起来:
//申明赋值一起来
var array2:[Int] = [1,2,3,4,5,6]
println(array2)
上面2种方法都是先申明,后赋值了。swift中还有一种申明数组的方式,是申明一个空数组,或者叫先申明一个数组,给它附上空值。因为一个数组光申明,如果不初始化赋值,打印它是会报错。
var array6 = [Int]() //申明Int类型数组并初始化赋值为空
var array8 = [String]() //申明String类型数组并初始化赋值为空
println(array6)
我们也可以在申明一个数组后,给它设定默认的值:
用var array = [type](count: int, repeatedValue:"value")
type 表示填充的变量类型。count 表示数组大小,repeatedValue 表示填充的值是什么。
var threeString = [String](count: 3, repeatedValue:"hello")
var threeInt= [Int](count: 3, repeatedValue:8)
println(threeString) // [hello, hello, hello]
println(threeInt) // [8, 8, 8]
或者直接去掉变量类型,swift会自动判断的:
var array = Array(count: int, repeatedValue:"value")
var threeString = Array(count: 3, repeatedValue:"hello")
println(threeString) // [hello, hello, hello]
之前我们就说过,swift中的变量的类型,我们是可以省略的,就像javascript的写法一样所以,swift会自动识别它的类型,所以一般我们会这样来表示一个数组:
var array3 = [1,2,3,4,5]
var array4 = ["a","b","c","d"]
var array5 = ["0",1,"ere"]
//输出
println(array3)
println(array4)
println(array5)
//屏幕输出结果
[1, 2, 3, 4, 5]
[a, b, c, d]
(
0,
1,
ere
)
注意
我们看到array5中居然是不同的数据类型成员,但是,编辑器没报错?你不是说swift中的数组是严格要求类型的吗?会报错吗?怎么这个是好的,还输出了。
因为,我们采用的是省略的写法,它就自动识别成字典
类型了。所以也是正确的。你从它的输出的结果,用()
来输出的,数组用的[]
,这个我们学习字典的时候再来说。
其他语言中是怎么申明和赋值数组的呢?
先是java, 哎,Java的一切都是蛋疼的,因为它推崇一切都是对象,所以,数组也是对象,也要new 初始化。
/*
java
*/
//1 先申明,再new
String array1[];
array1 = new String[3];
//只能一个一个赋值
array1[0]= "ww";
array1[1]= "ww";
array1[2]= "ww";
//array1[3]= "ww"; //因为只申明了3个值,这个就溢出了,报错。蛋疼!
// 2. 一起
String array2[] = new String[3];
//只能一个一个赋值
array2[0]= "ww";
array2[1]= "ww";
array2[2]= "ww";
//第二种方式, 一步到位,并赋值
String array3[] = {"ww","fg","ere"};
//这个时候只能修改原来的值了,不能新增值,因为只有3个
array3[0] = 123; // 不匹配,报错,只能是字符串
array3[3] = "erd"; // 溢出了,报错!
for (String i:array3) {
System.out.println(i);
}
php中当然是最爽的啦。随意使用!真是太爽了。
$a = array(); //当然这一句也可以不要, 也不会错
$a = array(
1,2,3,"wohahah",5,"xixii"
);
$a[55] = "566";
javascript中,和swift很像
var array1[]; //申明一下。
array1= [1,2,3,4,5];//赋值
array1[0] = 9; //修改
数组申明和赋值完成之后,肯定是有很多操作方法的。比如求数组的大小,判断数组是否为空啊。等等。
swift中也是用count
来求数组大小,但是它是个数组的一个属性值,不是一个函数方法。
var array8 = [1,2,3,4,5,6,7,8,9];
var array_8_count = array8.count;
println("array8数组的大小为:\(array_8_count)")
//输出: array8数组的大小为:9
用属性isEmpty
来判断,它返回一个boolean值,true或false
if array8.isEmpty {
println("The array8 is empty.")
} else {
println("The array8 is not empty.")
}
上面我们申明了很多数组,我们想要访问里面的某一个成员,比如访问第N个的值,我们可以和其他语言一样,用array[N]
来访问的。
var shoppingList = ["Eggs", "Milk"]
var index_0 = shoppingList[0];
var index_1 = shoppingList[1];
println(index_0); //输出Eggs
println(index_1); //输出Milk
既然我们可以通过array[0]
这样的方式取到第0个值,我们也同样可以用array[0] = "Pig"
这样的方式,给第0个成员重新赋值,因为这个数组申明的为var
变量,是可以重新修改赋值的,注意 如果是申明为let
常量就不能这样改动了。
var shoppingList = ["Eggs", "Milk"]
shoppingList[0] = "Pig" //将第0个元素重新赋值位Pig
shoppingList[1] = "Dog" //将第1个元素重新赋值位Dog
var index_0 = shoppingList[0];
var index_1 = shoppingList[1];
println(index_0); //Pig
println(index_1); //Dog
注意
下面会出现一个问题,也是极其容易想当然出错的。上面我们申明shoppList数组长度为2,那么它就限定死了。它的长度为2了。如果你通过array[2] = "hello"
这种方式给它加上第3个成员,是会报错fatal error: Array index out of range
var shoppingList = ["Eggs", "Milk"]
shoppingList[2] = "Hello" //报错:fatal error: Array index out of range
那,难道我们就不能给一个预先定义的数组扩充吗?当然可以。看下面:
上面我们看到了,强行给数组添加新的成员是会报错的,那如何向数组后面追加新的成员呢?swift里也有这样一个方法函数append()
,它是一个数组对象的一个方法,可以向这个数组后添加成员。
var animals = ["pig", "dog", "cat"]
animals.append("monkey")
println(animals) //输出:[pig, dog, cat, monkey]
println(animals[3]) // 输出:monkey
append()
方法是向数组的最后面追加数据,感觉比较鸡肋,不灵活,swift中的一个方法insert("value", atIndex: index)
就非常灵活了。可以往任意索引前追加数据,记住,是往前。注意 : 后面的atIndex一定要写,不能省略。
var foods = ["egg","bread","rice"]
//往第0个索引,也就是egg,前面添加icecream。
foods.insert("icecream", atIndex:0)
//往第一个索引,注意,这时候,egg就变成第1个数据了。
foods.insert("humbeag", atIndex:1)
println(foods)
//打印:[icecream, humbeag, egg, bread, rice]
那么,既然有向前某个索引值钱追加,有往某个索引值后面追加的函数吗?对不起!没有。啊。你会觉得苹果很操蛋啊。其实不是。insert("value", atIndex:index)
这个函数是往前追加,按照相对论的定义,不也是在往index-1的后面在追加数据吗?
var foods = ["egg","bread","rice"]
//我想往第1个索引值,也就是bread后面追加banana, 其实,也就是在rice,index=2前面追加了,对不对。
foods.insert("banana", atIndex: 2)
println(foods) //输出:[egg, bread, banana, rice]
可以用+=
操作符号,来扩充数组,或者合并几个数组。arrray1+=["value1","value2"] ,必须是相同类型的数据。
var mobile = ["iphone","htc","moto"]
mobile+=["huawei","lenove",]
mobile+=[4565] //类型不相同,报错。
var mobile2 = ["nokia"]
mobile += mobile2
//拆开也可以
var mobile3 = mobile + mobile2
println(mobile3)
// 输出:[iphone, htc, moto, huawei, lenove, 'nokia']
删除某个索引的值,可以用removeAtIndex(index)
来移除,返回值是移除的这一项的值。
var mobile3 = ["iphone","htc","moto", "nokia"]
var who = mobile3.removeAtIndex(3)
println(who) // 打印:nokia
println(mobile3) // 打印:[iphone, htc, moto] nokia被移除了。
或者,如果,我们直接就想删除最后一项,可以用removeLast()
。它同样也是返回被移除的最后一项的值。
var mobile3 = ["iphone","htc","moto", "nokia"]
var who = mobile3.removeLast()
println(who) // 打印:nokia
println(mobile3) // 打印:[iphone, htc, moto] nokia被移除了。
遍历数组,我们直接用for
语句循环。以后将for会着重说:
for i in shoppingList {
println(i)
}
//输出:
Pig
Dog
hello
或者我们想吧索引值也给循环出来,得用到枚举了。以后也会说到:
for (index, value) in enumerate(shoppingList) {
println("Item \(index): \(value)")
}
//输出
Item 0: Pig
Item 1: Dog
Item 2: hello
好了。数组也说到这了。妈的。太不容易了。