swift官方推荐翻译文档之集合类型
Swift 语言提供 Swift 语言中的
集合的可变性如果创建一个
数组(Arrays)数组使用有序列表存储同一类型的多个值。相同的值可以多次出现在一个数组的不同位置中。
数组的简单语法写 Swift 数组应该遵循像 创建一个空数组我们可以使用构造语法来创建一个由特定数据类型构成的空数组: varsomeInts=[Int]() print("someIntsisoftype[Int]with(someInts.count)items.") //打印"someIntsisoftype[Int]with0items." 注意,通过构造函数的类型, 或者,如果代码上下文中已经提供了类型信息,例如一个函数参数或者一个已经定义好类型的常量或者变量,我们可以使用空数组语句创建一个空数组,它的写法很简单: someInts.append(3) //someInts现在包含一个Int值 someInts=[] //someInts现在是空数组,但是仍然是[Int]类型的。 创建一个带有默认值的数组Swift 中的 varthreeDoubles=[Double](count:3,repeatedValue:0.0) //threeDoubles是一种[Double]数组,等价于[0.0,0.0,0.0] 通过两个数组相加创建一个数组我们可以使用加法操作符( varanotherThreeDoubles=Array(count:3,repeatedValue:2.5) //anotherThreeDoubles被推断为[Double],等价于[2.5,2.5,2.5] varsixDoubles=threeDoubles+anotherThreeDoubles //sixDoubles被推断为[Double],等价于[0.0,2.5] 用字面量构造数组我们可以使用字面量来进行数组构造,这是一种用一个或者多个数值构造数组的简单方法。字面量是一系列由逗号分割并由方括号包含的数值:
下面这个例子创建了一个叫做 varshoppingList:[String]=["Eggs","Milk"] //shoppingList已经被构造并且拥有两个初始项。
注意: 在这个例子中,字面量仅仅包含两个 由于 Swift 的类型推断机制,当我们用字面量构造只拥有相同类型值数组的时候,我们不必把数组的类型定义清楚。 varshoppingList=["Eggs","Milk"] 因为所有字面量中的值都是相同的类型,Swift 可以推断出 访问和修改数组我们可以通过数组的方法和属性来访问和修改数组,或者使用下标语法。 可以使用数组的只读属性 print("Theshoppinglistcontains(shoppingList.count)items.") //输出"Theshoppinglistcontains2items."(这个数组有2个项) 使用布尔值属性 ifshoppingList.isEmpty{ print("Theshoppinglistisempty.") }else{ print("Theshoppinglistisnotempty.") } //打印"Theshoppinglistisnotempty."(shoppinglist不是空的) 也可以使用 shoppingList.append("Flour") //shoppingList现在有3个数据项,有人在摊煎饼 除此之外,使用加法赋值运算符( shoppingList+=["BakingPowder"] //shoppingList现在有四项了 shoppingList+=["ChocolateSpread","Cheese","Butter"] //shoppingList现在有七项了 可以直接使用下标语法来获取数组中的数据项,把我们需要的数据项的索引值放在直接放在数组名称的方括号中: varfirstItem=shoppingList[0] //第一项是"Eggs" 注意: 我们也可以用下标来改变某个已有索引值对应的数据值: shoppingList[0]="Sixeggs" //其中的第一项现在是"Sixeggs"而不是"Eggs" 还可以利用下标来一次改变一系列数据值,即使新数据和原有数据的数量是不一样的。下面的例子把 shoppingList[4...6]=["Bananas","Apples"] //shoppingList现在有6项 注意: 调用数组的 shoppingList.insert("MapleSyrup",atIndex:0) //shoppingList现在有7项 //"MapleSyrup"现在是这个列表中的第一项 这次 类似的我们可以使用 letmapleSyrup=shoppingList.removeAtIndex(0) //索引值为0的数据项被移除 //shoppingList现在只有6项,而且不包括MapleSyrup //mapleSyrup常量的值等于被移除数据项的值"MapleSyrup" 注意: 数据项被移除后数组中的空出项会被自动填补,所以现在索引值为 firstItem=shoppingList[0] //firstItem现在等于"Sixeggs" 如果我们只想把数组中的最后一项移除,可以使用 letapples=shoppingList.removeLast() //数组的最后一项被移除了 //shoppingList现在只有5项,不包括Apples //apples常量的值现在等于"Apples"字符串 数组的遍历我们可以使用 foriteminshoppingList{ print(item) } //Sixeggs //Milk //Flour //BakingPowder //Bananas 如果我们同时需要每个数据项的值和索引值,可以使用 for(index,value)inshoppingList.enumerate(){ print("Item(String(index+1)):(value)") } //Item1:Sixeggs //Item2:Milk //Item3:Flour //Item4:BakingPowder //Item5:Bananas 更多关于 集合(Sets)集合(Set)用来存储相同类型并且没有确定顺序的值。当集合元素顺序不重要时或者希望确保每个元素只出现一次时可以使用集合而不是数组。
集合类型的哈希值一个类型为了存储在集合中,该类型必须是可哈希化的--也就是说,该类型必须提供一个方法来计算它的哈希值。一个哈希值是 Swift 的所有基本类型(比如
关于符合协议的更多信息,请看协议。 集合类型语法Swift 中的 创建和构造一个空的集合你可以通过构造器语法创建一个特定类型的空集合: varletters=Set<Character>() print("lettersisoftypeSet<Character>with(letters.count)items.") //打印"lettersisoftypeSet<Character>with0items."
此外,如果上下文提供了类型信息,比如作为函数的参数或者已知类型的变量或常量,我们可以通过一个空的数组字面量创建一个空的 letters.insert("a") //letters现在含有1个Character类型的值 letters=[] //letters现在是一个空的Set,但是它依然是Set<Character>类型 用数组字面量创建集合你可以使用数组字面量来构造集合,并且可以使用简化形式写一个或者多个值作为集合元素。 下面的例子创建一个称之为 varfavoriteGenres:Set<String>=["Rock","Classical","Hiphop"] //favoriteGenres被构造成含有三个初始值的集合 这个
一个 varfavoriteGenres:Set=["Rock","Hiphop"] 由于数组字面量中的所有元素类型相同,Swift 可以推断出 访问和修改一个集合你可以通过 为了找出一个 print("Ihave(favoriteGenres.count)favoritemusicgenres.") //打印"Ihave3favoritemusicgenres." print("Ihave(favoriteGenres.count)favoritemusicgenres.") //打印"Ihave3favoritemusicgenres." 使用布尔属性 iffavoriteGenres.isEmpty{ print("Asfarasmusicgoes,I'mnotpicky.") }else{ print("Ihaveparticularmusicpreferences.") } //打印"Ihaveparticularmusicpreferences." 你可以通过调用 favoriteGenres.insert("Jazz") //favoriteGenres现在包含4个元素 你可以通过调用 ifletremovedGenre=favoriteGenres.remove("Rock"){ print("(removedGenre)?I'moverit.") }else{ print("Inevermuchcaredforthat.") } //打印"Rock?I'moverit." 使用 iffavoriteGenres.contains("Funk"){ print("Igetuponthegoodfoot.") }else{ print("It'stoofunkyinhere.") } //打印"It'stoofunkyinhere." 遍历一个集合你可以在一个 forgenreinfavoriteGenres{ print("(genre)") } //Classical //Jazz //Hiphop Swift 的 forgenreinfavoriteGenres.sort(){ print("(genre)") } //prints"Classical" //prints"Hiphop" //prints"Jazz 集合操作你可以高效地完成 基本集合操作下面的插图描述了两个集合-
letoddDigits:Set=[1,3,5,7,9] letevenDigits:Set=[0,2,4,6,8] letsingleDigitPrimeNumbers:Set=[2,7] oddDigits.union(evenDigits).sort() //[0,1,8,9] oddDigits.intersect(evenDigits).sort() //[] oddDigits.subtract(singleDigitPrimeNumbers).sort() //[1,9] oddDigits.exclusiveOr(singleDigitPrimeNumbers).sort() //[1,9] 集合成员关系和相等下面的插图描述了三个集合-
lethouseAnimals:Set=[" |