Swift 语言提供经典的数组和字典两种集合类型来存储集合数据。数组用来按顺序存储同样类型的数据。字典尽管无序存储同样类型数据值可是须要由独有的标识符引用和寻址(就是键值对)。

Swift 语言里的数组和字典中存储的数据值类型必须明白。 这意味着我们不能把不对的数据类型插入当中。 同一时候这也说明我们全然能够对获取出的值类型很自信。 Swift 对显式类型集合的使用确保了我们的代码对工作所须要的类型很清楚,也让我们在开发中能够早早地找到不论什么的类型不匹配错误。

注意:

Swift 的数组结构在被声明成常量和变量或者被传入函数与方法中时会相对于其它类型展现出不同的特性。获取很多其它信息请參见集合的可变性与集合在赋值和复制中的行为章节。

数组

数组使用有序列表存储同样类型的多重数据。同样的值能够多次出如今一个数组的不同位置中。

Swift 数组对存储数据有详细要求。 不同于 Objective-C 的NSArray和NSMutableArray类,他们能够存储不论什么类型的实例并且不提供他们返回对象的不论什么本质信息。在 Swift 中,数据值在被存储进入某个数组之前类型必须明白,方法是通过显式的类型标注或类型判断,并且不是必须是class类型。比如:假设我们创建了一个Int值类型的数组,我们不能往当中插入不论什么不是Int类型的数据。 Swift 中的数组是类型安全的,并且它们中包括的类型必须明白。

数组的简单语法

写 Swift 数组应该遵循像Array<SomeType>这种形式,当中SomeType是这个数组中唯一同意存在的数据类型。我们也能够使用像SomeType[]这种简单语法。虽然两种形式在功能上是一样的,可是推荐较短的那种,并且在本文中都会使用这种形式来使用数组。

数组构造语句

我们能够使用字面语句来进行数组构造,这是一种用一个或者多个数值构造数组的简单方法。字面语句是一系列由逗号切割并由方括号包括的数值。 [value 1, value 2, value 3]。

以下这个样例创建了一个叫做shoppingList而且存储字符串的数组:

var shoppingList: String[] =["Eggs", "Milk"]
// shoppingList 已经被构造而且拥有两个初始项。

shoppingList变量被声明为“字符串值类型的数组“,记作String[]。 由于这个数组被规定仅仅有String一种数据结构,所以仅仅有String类型能够在当中被存取。 在这里,shoppinglist数组由两个String值("Eggs"和"Milk")构造,而且由字面语句定义。

注意:

Shoppinglist数组被声明为变量(varkeyword创建)而不是常量(let创建)是由于以后可能会有很多其它的数据项被插入当中。

在这个样例中,字面语句只包括两个String值。匹配了该数组的变量声明(只能包括String的数组),所以这个字面语句的分配过程就是同意用两个初始项来构造shoppinglist。

因为 Swift 的类型判断机制,当我们用字面语句构造仅仅拥有同样类型值数组的时候,我们不必把数组的类型定义清楚。 shoppinglist的构造也能够这样写:

var shoppingList = ["Eggs","Milk"]

由于全部字面语句中的值都是同样的类型,Swift 能够判断出String[]是shoppinglist中变量的正确类型。

訪问和改动数组

我们能够通过数组的方法和属性来訪问和改动数组,或者下标语法。还能够使用数组的仅仅读属性count来获取数组中的数据项数量。

println("The shopping list contains\(shoppingList.count) items.")
// 输出"The shoppinglist contains 2 items."(这个数组有2个项)

使用布尔项isEmpty来作为检查count属性的值是否为 0 的捷径。

 if shoppingList.isEmpty {
println("The shopping list is empty.")
} else {
println("The shopping list is not empty.")
}
// 打印 "The shoppinglist is not empty."(shoppinglist不是空的)

也能够使用append方法在数组后面加入新的数据项:

shoppingList.append("Flour")
// shoppingList 如今有3个数据项,有人在摊煎饼

除此之外,使用加法赋值运算符(+=)也能够直接在数组后面加入数据项:

shoppingList += "Baking Powder"
// shoppingList 如今有四项了

我们也能够使用加法赋值运算符(+=)直接加入拥有同样类型数据的数组。

shoppingList += ["ChocolateSpread", "Cheese", "Butter"]
// shoppingList 如今有7项了

能够直接使用下标语法来获取数组中的数据项,把我们须要的数据项的索引值放在直接放在数组名称的方括号里:

var firstItem = shoppingList[0]
// 第一项是 "Eggs"

注意第一项在数组中的索引值是0而不是1。 Swift 中的数组索引总是从零開始。

我们也能够用下标来改变某个已有索引值相应的数据值:

shoppingList[0] = "Six eggs"
// 当中的第一项如今是 "Sixeggs" 而不是 "Eggs"

还能够利用下标来一次改变一系列数据值,即使新数据和原有数据的数量是不一样的。以下的样例把"Chocolate Spread","Cheese",和"Butter"替换为"Bananas"和"Apples":

shoppingList[4...6] = ["Bananas","Apples"]
// shoppingList 如今有六项

注意:

我们不能使用下标语法在数组尾部加入新项。假设我们试着用这样的方法对索引越界的数据进行检索或者设置新值的操作,我们会引发一个执行期错误。我们能够使用索引值和数组的count属性进行比較来在使用某个索引之前先检验是否有效。除了当count等于 0 时(说明这是个空数组),最大索引值一直是count - 1,由于数组都是零起索引。

调用数组的insert(atIndex:)方法来在某个详细索引值之前加入数据项:

shoppingList.insert("MapleSyrup", atIndex: 0)
// shoppingList 如今有7项
// "Maple Syrup" 如今是这个列表中的第一项

这次insert函数调用把值为"Maple Syrup"的新数据项插入列表的最開始位置,而且使用0作为索引值。

类似的我们能够使用removeAtIndex方法来移除数组中的某一项。这种方法把数组在特定索引值中存储的数据项移除而且返回这个被移除的数据项(我们不须要的时候就能够无视它):

let mapleSyrup =shoppingList.removeAtIndex(0)
//索引值为0的数据项被移除
// shoppingList 如今仅仅有6项,并且不包含MapleSyrup
// mapleSyrup常量的值等于被移除数据项的值"Maple Syrup"

数据项被移除后数组中的空出项会被自己主动填补,所以如今索引值为0的数据项的值再次等于"Six eggs":

firstItem = shoppingList[0]
// firstItem 如今等于 "Sixeggs"

假设我们仅仅想把数组中的最后一项移除,能够使用removeLast方法而不是removeAtIndex方法来避免我们须要获取数组的count属性。就像后者一样,前者也会返回被移除的数据项:

let apples = shoppingList.removeLast()
// 数组的最后一项被移除了
// shoppingList如今仅仅有5项,不包含cheese
// apples 常量的值如今等于"Apples" 字符串

数组的遍历

我们能够使用for-in循环来遍历全部数组中的数据项:

for item in shoppingList {
println(item)
}
// Six eggs
// Milk
// Flour
// Baking Powder
// Bananas

假设我们同一时候须要每个数据项的值和索引值,能够使用全局enumerate函数来进行数组遍历。enumerate返回一个由每个数据项索引值和数据值组成的键值对组。我们能够把这个键值对组分解成暂时常量或者变量来进行遍历:

for (index, value) inenumerate(shoppingList) {
println("Item \(index + 1): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
// Item 3: Flour
// Item 4: Baking Powder
// Item 5: Bananas

很多其它关于for-in循环的介绍请參见for 循环。

创建而且构造一个数组

我们能够使用构造语法来创建一个由特定数据类型构成的空数组:

var someInts = Int[]()
println("someInts is of type Int[]with \(someInts。count) items。")
// 打印 "someInts isof type Int[] with 0 items。"(someInts是0数据项的Int[]数组)

注意someInts被设置为一个Int[]构造函数的输出所以它的变量类型被定义为Int[]。

除此之外,假设代码上下文中提供了类型信息,比如一个函数參数或者一个已经定义好类型的常量或者变量,我们能够使用空数组语句创建一个空数组,它的写法非常easy:[](一对空方括号):

someInts.append(3)
// someInts 如今包括一个INT值
someInts = []
// someInts 如今是空数组,可是仍然是Int[]类型的。

Swift 中的Array类型还提供一个能够创建特定大小而且全部数据都被默认的构造方法。我们能够把准备增加新数组的数据项数量(count)和适当类型的初始值(repeatedValue)传入数组构造函数:

var threeDoubles = Double[](count: 3,repeatedValue:0.0)
// threeDoubles 是一种 Double[]数组, 等于 [0.0, 0.0,0.0]

由于类型判断的存在,我们使用这样的构造方法的时候不须要特别指定数组中存储的数据类型,由于类型能够从默认值判断出来:

var anotherThreeDoubles = Array(count: 3,repeatedValue: 2.5)
// anotherThreeDoubles is inferred asDouble[], and equals [2.5, 2.5, 2.5]

最后,我们能够使用加法操作符(+)来组合两种已存在的同样类型数组。新数组的数据类型会被从两个数组的数据类型中判断出来:

var sixDoubles = threeDoubles +anotherThreeDoubles
// sixDoubles 被判断为Double[], 等于 [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]

Swift编程语言学习3.1排列的更多相关文章

  1. Swift编程语言学习9—— 存储属性和计算属性

    属性将值跟特定的类.结构或枚举关联.存储属性存储常量或变量作为实例的一部分,计算属性计算(而不是存储)一个值.计算属性能够用于类.结构体和枚举里,存储属性仅仅能用于类和结构体. 存储属性和计算属性通经 ...

  2. Swift 编程语言学习0.1——Swift简单介绍

    有的时候,认为看英文文档有些费时,看中文文档怕翻译不准,有些地方确实不须要抠字眼.当有些地方假设翻译不精准会产生歧义,所以用这样对比的方式.顺便学习一下Swift. Swift is a new pr ...

  3. Swift编程语言学习6—— 闭包

    闭包是自包括的函数代码块,能够在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其它一些编程语言中的 lambdas 函数比較类似.   闭 ...

  4. Swift编程语言学习4.3—— 控制语句

    控制传递语句(Control Transfer Statements) 控制转移语句改变你代码的运行顺序,通过它你能够实现代码的跳转.Swift有四种控制转移语句. continue break fa ...

  5. Swift编程语言学习2.1——基础运营商(在)

    操作员正在检查,更改.归并值特殊符号或短语.例如,加+这两个数字相加(例如let i = 1 + 2). 算如更复杂的逻辑和操作的实施&&(例如if enteredDoorCode & ...

  6. Swift编程语言学习11—— 枚举全局变量、局部变量与类型属性

    全局变量和局部变量 计算属性和属性监视器所描写叙述的模式也能够用于全局变量和局部变量,全局变量是在函数.方法.闭包或不论什么类型之外定义的变量,局部变量是在函数.方法或闭包内部定义的变量. 前面章节提 ...

  7. Swift编程语言学习1.4——数值型字面量、数值类型转换

    数值型字面量 整数字面量能够被写作: 一个十进制数,没有前缀 一个二进制数,前缀是0b 一个八进制数,前缀是0o 一个十六进制数,前缀是0x 以下的全部整数字面量的十进制值都是17: let deci ...

  8. Swift编程语言学习1.3——类型安全和投机型

    Swift 是类型安全(type safe )语言.类型安全的语言可以让你清楚地知道代码被处理值类型.假设你需要一个代码String.你绝对不能进去一个不小心传球Int. 因为 Swift 它是类型安 ...

  9. Swift编程语言学习12 ——实例方法(Instance Methods)和类型方法(Type Methods)

    方法是与某些特定类型相关联的函数.类.结构体.枚举都能够定义实例方法:实例方法为给定类型的实例封装了详细的任务与功能.类.结构体.枚举也能够定义类型方法:类型方法与类型本身相关联.类型方法与 Obje ...

随机推荐

  1. windows下以指定用户访问SMB服务器进行读写

    需求:最近要开发某系统前端界面,但是该系统是部署在linux服务器上,前端是用php开发,实时调试运行需要linux下系统环境支持, 每次修改都需要手动传到服务器上,尤其是debug阶段,每修改一点就 ...

  2. java序列化对象 插入、查询、更新到数据库

    java序列化对象 插入.查询.更新到数据库 : 实现代码例如以下: import java.io.ByteArrayInputStream; import java.io.ByteArrayOutp ...

  3. 改ucosii的中断禁止和恢复代码,这是一个荒谬的错误【 mrs msr】

    ucosii原来的禁止中断以及恢复中断的代码是最简的,但是使用之前,必须声明一个固定名为 OS_CPU_SR   cpu_sr 的变量,吊在那里感觉很怪. ;********************* ...

  4. H5前端面试题及答案(2)

    最近想着跳槽,但面试的邀约不多,内心有点烦躁.梳理梳理心情,跳槽季竞争也大,努力做好自己... 21.请设计一套方案,用于确保页面中js加载完全. <!doctype html> < ...

  5. shell中exec解析(转)

    参考:<linux命令.编辑器与shell编程> <unix环境高级编程> exec和source都属于bash内部命令(builtins commands),在bash下输入 ...

  6. c语言数组初始化问题

    2147483648字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. charstr[10]={'I','','a','m','',‘h’,'a','p','p','y'}; 即把10 ...

  7. C/C++ qsort()快速排序用法

    void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));头文件stdlib.h ...

  8. Android开发10.1:UI组件适配器AdapterView(创建ListView,Adapter接口)

    @version:Android4.3 API18 @author:liuxinming 概述               AdapterView继承了ViewGroup,它的本质是容器       ...

  9. Swift - 获取字符串的MD5值

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5实现. ...

  10. UVa 11045 My T-shirt suits me / 二分图

    二分图建图 判断是否是完全匹配就行 最大流也行 #include <cstdio> #include <cstring> const int MAX = 300; int a[ ...