Swift编程语言学习3.1排列

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]
时间: 2024-12-19 18:11:41

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

Swift编程语言学习2.2——基本运算符(下)

三元条件运算(Ternary Conditional Operator) 三元条件运算的特殊在于它是有三个操作数的运算符,它的原型是问题?答案1:答案2.它简洁地表达根据问题成立与否作出二选一的操作.如果问题成立,返回答案1的结果; 如果不成立,返回答案2的结果. 使用三元条件运算简化了以下代码: if question: { answer1 } else { answer2 } 这里有个计算表格行高的例子.如果有表头,那行高应比内容高度要高出50像素; 如果没有表头,只需高出20像素. let

Swift编程语言学习1.5——类型别名、布尔值、元组

类型别名 类型别名(type aliases)就是给现有类型定义另一个名字.你可以使用typealias关键字来定义类型别名. 当你想要给现有类型起一个更有意义的名字时,类型别名非常有用.假设你正在处理特定长度的外部资源的数据: typealias AudioSample = UInt16 定义了一个类型别名之后,你可以在任何使用原始名的地方使用别名: var maxAmplitudeFound = AudioSample.min // maxAmplitudeFound 现在是 0 本例中,A

Swift编程语言学习1.6——可选值

可选值 使用可选(optionals)来处理值可能缺失的情况.可选表示: 有值,等于 x   或者没有值 注意: C 和 Objective-C 中并没有可选这个概念.最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回nil,nil表示"缺少一个合法的对象".然而,这只对对象起作用--对于结构体,基本的 C 类型或者枚举类型不起作用.对于这些类型,Objective-C 方法一般会返回一个特殊值(比如NSNotFound)来暗示值缺失.这种方法假设方法的

Swift编程语言学习1.7——断言

断言 可选可以让你判断值是否存在,你可以在代码中优雅地处理值缺失的情况.然而,在某些情况下,如果值缺失或者值并不满足特定的条件,你的代码可能并不需要继续执行.这时,你可以在你的代码中触发一个断言(assertion)来结束代码运行并通过调试来找到值缺失的原因. 使用断言进行调试 断言会在运行时判断一个逻辑条件是否为true.从字面意思来说,断言"断言"一个条件是否为真.你可以使用断言来保证在运行其他代码之前,某些重要的条件已经被满足.如果条件判断为true,代码运行会继续进行:如果条件

Swift编程语言学习——常量与变量

常量和变量把一个名字(比如maximumNumberOfLoginAttempts或者welcomeMessage)和一个指定类型的值(比如数字10或者字符串"Hello")关联起来.常量的值一旦设定就不能改变,而变量的值可以随意更改. 声明常量和变量 常量和变量必须在使用前声明,用let来声明常量,用var来声明变量.下面的例子展示了如何用常量和变量来记录用户尝试登录的次数: let maximumNumberOfLoginAttempts = 10 var currentLogin

Swift编程语言学习2.1——基本运算符(上)

运算符是检查,改变,合并值的特殊符号或短语.例如,加号+将两个数相加(如let i = 1 + 2).复杂些的运行算例如逻辑与运算符&&(如if enteredDoorCode && passedRetinaScan),又或让 i 值加1的便捷运算符自增运算符++i等. Swift 支持大部分标准 C 语言的运算符,且改进许多特性来减少常规编码错误.如,赋值符(=)不返回值,以防止把想要判断相等运算符(==)的地方写成赋值符导致的错误.数值运算符(+,-,*,/,%等)会检

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

数值型字面量 整数字面量可以被写作: 一个十进制数,没有前缀 一个二进制数,前缀是0b 一个八进制数,前缀是0o 一个十六进制数,前缀是0x 下面的所有整数字面量的十进制值都是17: let decimalInteger = 17 let binaryInteger = 0b10001 // 二进制的17 let octalInteger = 0o21 // 八进制的17 let hexadecimalInteger = 0x11 // 十六进制的17 浮点字面量可以是十进制(没有前缀)或者是十

Swift 编程语言学习——Swift简介

有的时候,觉得看英文文档有些费时,看中文文档怕翻译不准,有些地方确实不需要抠字眼,当有些地方如果翻译不精准会产生歧义,所以用这样对照的方式,顺便学习一下Swift. Swift is a new programming language for iOS and OS X apps that builds on the best of C and Objective-C, without the constraints of C compatibility. Swift adopts safe p

Swift编程语言学习——类型安全和类型推测

Swift 是一种类型安全(type safe )的语言.类型安全的语言可以让你清楚地知道代码要处理的值的类型.如果你的代码需要一个String,你绝对不可能不小心传进去一个Int. 由于 Swift 是类型安全的,所以它会在编译你的代码时进行类型检查(type checks),并把不匹配的类型标记为错误.这可以让你在开发的时候尽早发现并修复错误. 当你要处理不同类型的值时,类型检查可以帮你避免错误.然而,这并不是说你每次声明常量和变量的时候都需要显式指定类型.如果你没有显式指定类型,Swift