Swift from Scratch: Collections and Tuples

来源:互联网 发布:java中nio流详解 编辑:程序博客网 时间:2024/06/10 05:50

在前面的文章中,你学习了变量,常量和一些常用数据类型,例如整形,浮点数和字符串。在这篇文章中,我们聚焦于collections。swift的标准库定义了两种collection类型,数列和字典。我们从数列讲起。

Arrays

如果你熟悉oc,js或者php,你不会对数列的概念有任何问题。数列是一个有序的,索引开始于0的值的collection。然而,存在一些重要的差别

Type

第一个与oc不同的是存在于array的值需要是同一种类型。一开始,你可能觉得这个是一个很大的限制,但是不然。事实上,这个限制是一个很大的优点。当我们询问数列时,我们很确定的知道返回的值是什么类型。
另一个关键不同在于数列能存储的值的类型。在oc中,数列只能存储类类型的值。swift没有这个限制。swift中的数列能够存储字符串,整形,浮点同样可以存储类实例。当我们讨论类和结构的时候,这些工作机理会变得清晰。

Declaring

尽管创造数组的方法很多,你需要记住,swift需要知道你计划存储在数列中的值的类型。在Xcode中新建playground然后添加下面的代码

var array1:Arrary<String>var array2:[string]var array3=["Apple","Pear","Orange"]

第二行是第一行的缩写。方括号包裹了String告诉swift正在声明一个数组,该数组只能包含String对象。
你可以这样阐述第一行,我们声明了一个名为array的数组,该数组只能存储String对象。
第三行向我们展示了如何初始化一个数组。
还有一个花哨的方法来初始化一个数组,用一个默认值和事先定好的数量。这个语法一开始可能看起来会让人困扰,花点时间来消化。

var a=[String](count:5,repeatedValue:"Test")

为了更好的理解上面的初始化,看看下面的两行代码。

var b=Array<String>()var c=[String]()

如果仍然感到困惑,你不要烦恼。当我们探索类和函数的语法时,我们会阐述的更加详细。在这篇文章里,我们聚焦于collection

Mutability

你会欣赏swift是声明mutable collection的方式。上面的代码声明了三个mutable arrays。一个mutable 数组是用var来定义的。就这么简单,如果你不想要array是mutable,就使用let。swift目标在于直观,便于使用。swift对于mutability的实现是这个目标的一个很好例证。

Getting and Setting Values

访问数列的值使用oc的相同方法。在下面的例子中,我们访问array3的第二个元素。

array3[1]

改变元素的值也很简单

array3[1]="Peach"

由于array是mutable所以这个可能,我们使用var声明这个数组。改变一个constant数组是不可能的。还有很多高级的技术来操作数组的内容,不过底下的概念是一样的。
合并两个数组就是简单的相加,在下面的例子中,我们声明并且合并了两个不能改变的数组。注意最后的数组c不需要是可变数组。

let a=[1,2,3]let b=[4,5,6]let c=a+b

然而,存储在a和b的值必须是相同类型,这一点很关键。原因到此应该很容易理解。存储在数组中的值需要是同一种类型。下面的例子会导致错误

let a=[1,2,3]let b=[1.5,5.2,6.3]let c=a+b

将一个数组附加在一个可变数组后,我们使用的是+=操作符,注意该操作符的右边是一个数组。注意如果我们将4的方括号去掉,这个操作不会成功。

var a=[1,2,3]a+=[4]

Operations

数组是你可以进行很多操作的对象。数组有大量的函数和方法,你使用点标记来调用方法。下面这行添加item

array3.append("Cherry")

让我们看看array3有多少item,调用count方法

array3.count

下面的代码可以在数组指定的位置插入item

array3.insert("Prune",atIndex:2)

和oc一样,swift支持命名的参数来提高可读性。这样的代码更容易阅读和理解,函数和方法也不需要过多的解释其操作。
尽管swift相对oc更加的简洁和干脆,它的确支持命名参数,如果你有php,ruby和js的背景,这需要点时间来适应。

Convenience Methods

我享受swift的是它类似ruby的非常便利的标准库。数组,举个例子,有isEmpty性质来告诉你数组是否含有元素,这无非是数组count性质的缩写,但是这提高了代码的可读性和简洁。

array3.isEmpty

Dictionaries

swift的字典和oc的字典表现类型。字典是无序的值的集合,每一个值都有一个对应的key。换句话说,字典存储了一些键值对。

Type

和数组一样,字典里的key和value必须是同一种类型,这意味着如果你询问字典中某个key对应的值,你知道字典会返回什么类型

Declaring

声明字典和声明数组类似,不同的就是你需要指定key和value的类型。下面的例子显示了三种声明字典的方法

var dictionary1:Dictionary<String,Int>var dictionary2:[String:Int]var dictionary3=["Apple":3,"Pear",8,"Orange":11]

第二行是第一行的速写。这些字典的key需要是String类型,值需要是Int类型。var指明了这个字典可变。
第一行意思是我们声明一个变量dictionary1为字典类型,这个字典只能包含keys为string,values为Int
第三行阐述了我们如何初始化一个字典,跟我们在oc中使用语法类似,但是注意大括号被方括号代替,@符号也不见了。

Getting and Setting Values

访问字典value的方法和数组类似,唯一的区别是你使用key而不是索引来访问value。下面的例子很好的阐述了这个概念

let value=dictionary3["Apple"]println(value)

你发现Xcode告诉我们value的值不是3,而是Optional(3),这是神马意思?swift用optionals来包裹那些值为value或是nil的value。不要忧虑optionals,我们会在下一次的文章中好好讨论optionals,我只是告诉你optionals是swift编程语言的另一个关键概念。
指出在字典访问value的语法和数组一样,前提字典的key是Int类型,这非常有意思,看看下面的代码

var dictionary4=[0:"Apple",1:"Pear",2:"Orange"]let fruit=dicitonary4[0]

Operation

和数组一样,swift标准库定义了很多操作字典的方法。字典通过调用count方法来返回键值对的数量。删除键值简单又直观,当然这要在字典可变的前提下

dictionary4.removeValueForKey(0)

当你开始学习swift,你会遇到一些让你觉得怪异或者困扰的代码。看看下面的例子。

var dictionary5=[String:Int]()dictionary5["Orange"]=2;dictionary5["Apples"]=10;dictionary5["Pears"]=5dictionary5[:]

你得承认最后一行看起来非常怪异,因为swift知道可以存储在dictionary5的键值类型,倒空字典仅仅就是赋予其空字典就行。
在这个例子中不需要指出键值类型,因为我们在声明字典的时候已经这样做了。这指出了另一个细节,键值类型或者值类型在数组和字典声明后就不能改变了。

Tuples

你会爱上Tuples。虽然Tuples不是collection,他们还是将很多值聚集在一起。和数组字典类型,tuples可以包含任何类型的值。最关键的是,tuples存储的值不需要是同一个类型,让我们来看一个例子

var currency=("EUR",0.81)var time=(NSDate(),"This is my message")var email=("Bart Jacobs","bart@example.com")

第一个例子声明了名为currency的tuple,类型是(String,Double),第二个tuple包含了NSDate实例和一个字符串。存储在email的值都是类型String,意味着email的类型是(String,String)

Accessing values

访问存储在tuple中的value,你可以使用索引

var rate=currency.1var message=email.1var name=email.0

Xcode中会显示如下的信息

为了提高可读性,你可以给tuple中的值取名字。结果是你可以通过它们的名字来访问值。

var currency=(name:"EUR",rate:0.81)let currencyName=currency.namelet currencyRate=currency.rate

Decomposition

还有另一种优雅的方法来和tuple中的值打交道。

let (currencyName,currencyRate)=currency

currency在索引0的值存储在currencyName,currency在索引1的值存储在currencyRate。没有必要在指定currencyName,currencyRate的类型,因为swift可以从currency中推断出。换句话说,currencyName的类型是string,currencyRate的类型是float。
如果你对tuple的某个值不感兴趣,你可以使用下划线来告诉swift哪个值你不感兴趣。

let(currencyName,_)=currency

Conclusion

数组和字典是每个编程语言最基本的组成部分,swift也不例外。尽管collections在swift中优点表现不同,如果你和其他编程语言中的collecitons打过交道,你很快就能上手。在下个tutorial中,我们会探索optionals和控制流

0 0