Welcome to Swift (苹果官方Swift文档初译与注解二十三)---154~162页(第三章--集合类型)

Dictionaries (字典)

  字典像是一个容器,它可以存放很多相同类型的值.每个值都有与之关联的唯一的键,键在字典里的作用,就像是每个值的身份证标识一样.与数组中的元素不同,字典里的每个元素没有  固定的循序.当你使用字典并且要查询一个值的时候,需要使用值的标识(key)才行.这就像是你在生活里使用一本字典来查找某个单词的定义一样.

  在Swift中,字典能够存储的类型需要明确定义.这与OC中的NSDictionary 类和NSMutableDictionary 类很不同,OC中它们可以使用任意对象来作为key和值而不必提供这些类的任何信  息.在Swift中,字典中key和值的类型必须总是明确出来.

  Swift中,字典类型的写法是:Dictionary<KeyType, ValueType>,其中KeyType是字典中key的类型,ValueType是字典中可以储存的值的类型.

  这里唯一的限定是,KeyType必须是可以哈希(hashable),也就是它必须提供一个可以使自身唯一的标识.所有的Swift中的基本类型(例如String, Int, Double, 和 Bool)默认都是可以哈  希的.并且这些基本类型都可以在字典中用作key.没有分配值的枚举成员默认也是可以哈希的.

Dictionary Literals (字典语法  /**呵呵,前面可能翻译有误,请各位细心体会*/)

  使用字典的语法可以初始化一个字典,这和数组的语法和接近.这个语法也可以缩写为一个或者多个键值对.

  一个键值对包含一个key(键)和一个value(值).在字典中,键值对的键和值使用冒号分隔.键值对与键值对之间,使用逗号分隔,最后用中括号[]包住:

    [key 1: value 1, key 2: value 2, key 3: value 3]

  下面的代码例子,创建一个字典,储存国际机场的名字.在这个字典中,key是三个字母的国际空运协会编码,value是机场的名字:

    var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]

  字典airports被定义为Dictionary<String, String>类型,这意味着它的键是String类型,它的值也是String类型.

  注意点:

  字典airports是一个变量,不是常量.因为后面的代码例子要给它添加更多的机场.

  字典airports通过包含两个键值对的字典语法进行初始化.第一个键值对是键TYO和值Tokyo,第二个键值对是键DUB和值Dublin

  字典语法中使用了两String: String键值对,这刚刚好匹配airports变量的声明,因此使用这样的语句进行初始化字典airports是可以的.

  像数组一样,如果初始化的时候使用了键值的确定类型,你可以省略字典的类型.因此,airports的初始化可以缩写为:

    var airports = ["TYO": "Tokyo", "DUB": "Dublin"]

  这是因为键的类型和值的类型都与赋值的相互匹配,这样Swift编译器可以判断字典airports的类型是Dictionary<String, String>.

Accessing and Modifying a Dictionary (访问和修改字典)

  通过字典的方法和属性,可以访问和修改一个字典,或者使用下标也可以.与数组一样,你可以使用字典的只读count属性来确定字典里的条目数量:

    println("The dictionary of airports contains \(airports.count) items.")

    // prints "The dictionary of airports contains 2 items.

  可以使用下标来给字典添加一个新的条目,其中新的key作为下标类型,并给value赋值匹配类型的新值:

    airports["LHR"] = "London"

    // the airports dictionary now contains 3 items

  你也可以使用下标(键)来修改与之相对应的值:

    airports["LHR"] = "London Heathrow"

    // the value for "LHR" has been changed to "London Heathrow”

  除了上述使用下标修改值之外,使用字典的updateValue(forKey:)方法来设置或更新对应键的值.像使用下标一样,方法updateValue(forKey:)如果发现没有key,就会新建一个key并设置  值,如果有key,就更新这个key的值.与使用下标不一样的是,方法updateValue(forKey:)在执行更新后会返回旧的值,这可以让你检查是否进行了更新.

  updateValue(forKey:)方法返回一个值类型的可选值.例如,字典储存的值是String类型,这个方法就会返回一个 String?类型的值.这个可选值包含一个旧值(如果key对应的值存在的)或  者一个nil(如果key对应的值不存在):

    if let oldValue = airports.updateValue("Dublin International", forKey: "DUB") {

       println("The old value for DUB was \(oldValue).")

    }

    // prints "The old value for DUB was Dublin.”

  你也可以使用下标(key被用作下标)来获取字典里的值.因为一个key可能没有值,因此返回值是字典中value值类型的可选类型.如果字典中可以找到key对应的值,就返回这个值,否则,返  回nil:

    if let airportName = airports["DUB"] {

     println("The name of the airport is \(airportName).")

    } else {

       println("That airport is not in the airports dictionary.")

    }

    // prints "The name of the airport is Dublin International.”

  你也可以使用下标语法来移除一对键值,通过给这个key关联的value赋值为nil:

    airports["APL"] = "Apple International"

    // "Apple International" is not the real airport for APL, so delete it

    airports["APL"] = nil

    // APL 现在已经被从字典中移除

  除此之外,移除键值对也可以使用字典的removeValueForKey方法.如果键值对存在,这个方法将移除这个键值对并返回移除的值,如果键值对不存在,这个方法放回nil:

    if let removedValue = airports.removeValueForKey("DUB") {

       println("The removed airport‘s name is \(removedValue).")

    } else {

       println("The airports dictionary does not contain a value for DUB.")

    }

    // prints "The removed airport‘s name is Dublin International.”

Iterating Over a Dictionary (遍历字典)

  你可以使用for-in循环来遍历字典里的键值对,字典里返回的每个条目都是一个(key, value)的元组,你可以将它们保存在临时常量或变量中:

    for (airportCode, airportName) in airports {

       println("\(airportCode): \(airportName)")

    }

    // TYO: Tokyo

    // LHR: London Heathrow

  你也可以通过访问字典的keys属性和values属性来遍历:

    for airportCode in airports.keys {

      println("Airport code: \(airportCode)")

    }

    // Airport code: TYO

    // Airport code: LHR

    for airportName in airports.values {

       println("Airport name: \(airportName)")

    }

    // Airport name: Tokyo

    // Airport name: London Heathrow

  如果你需要使用字典的键或值来作为一个数组实例的API,可以使用keys和values属性来初始化一个新数组:

    let airportCodes = Array(airports.keys)

    // airportCodes is ["TYO", "LHR"]

    let airportNames = Array(airports.values)

    // airportNames is ["Tokyo", "London Heathrow"]

  注意点:

  在Swift中,字典类型是一种无序的集合.当在遍历一个字典的时候,字典中的keys和values以及键值对的顺序都是没有确定的.

Creating an Empty Dictionary (创建空字典)

  像数组一样,可以通过初始化语法来创建某种类型的空字典:

    var namesOfIntegers = Dictionary<Int, String>()

    // namesOfIntegers is an empty Dictionary<Int, String>

  这个代码例子中,创建一个空的字典,类型是Int, String.它的key是Int类型,它的values是Striing类型.

  如果字典的类型信息已经确认,可以使用一个空字典语法(写作[:])来创建一个空的字典:

    namesOfIntegers[16] = "sixteen"

    // namesOfIntegers now contains 1 key-value pair

    namesOfIntegers = [:]

    // namesOfIntegers is once again an empty dictionary of type Int, String

  注意点:

  在Swift后台机制中,字典和数组的类型都被当做一种通用集合(generic collections)

Welcome to Swift (苹果官方Swift文档初译与注解二十三)---154~162页(第三章--集合类型)

时间: 2024-08-06 02:52:47

Welcome to Swift (苹果官方Swift文档初译与注解二十三)---154~162页(第三章--集合类型)的相关文章

Welcome to Swift (苹果官方Swift文档初译与注解二十一)---140~147页(第三章--集合类型)

第三章 Collection Types (集合类型) 在Swift中,提供了两种集合类型用来存储一组值:数组和字典.数组有序的存储相同类型的值;字典存储无序的相同类型的值.字典可以通过唯一的标识(就是所说的键)来查询和访问. 在Swift中,数组和字典总是要清晰的标明他们存储数据的类型.这就意味着不可以将错误的类型插入到数组或字典中.同时也意味着你是明确了解你要遍历的数组或字典里面数据的类 型.在Swift中,集合要显式的声明类型来保证在开发中都会明确的知道它能处理的数据类型. 注意点: 在S

Welcome to Swift (苹果官方Swift文档初译与注解二十七)---189~198页(第四章-- 流程控制)

Switch 一个switch语句里包含一个值,并且用这个值与其他几个可能的匹配模式进行比较,然后根据成功匹配上的模式,执行相应的代码块.switch语句提供了比if语句更多的选项来相应多种潜 在的情况. 最简单的一个例子: switch some value to consider { case value 1:   respond to value 1 case value 2, value 3:   respond to value 2 or 3 default:   otherwise,

Welcome to Swift (苹果官方Swift文档初译与注解二十)---133~139页(第二章..本节完)

Unicode (Unicode码) Unicode是一种国际标准的文本编码.它的标准表中几乎包含所有语言的任意字符,并且可以通过扩展文件或者网页读写这些字符. 在Swift中,String(字符串)类型和Character(字符)类型完全兼容Unicode,而且它们也支持非Unicode码. Unicode Terminology (Unicode 术语) 每个Unicode码都可以用一个或者多个Unicode标量表示.对于一个字符来说,一个Unicode标量都是一个唯一的21位的值(或名称)

Welcome to Swift (苹果官方Swift文档初译与注解二十八)---199~208页(第四章-- 流程控制)

Value Bindings (绑定值) 在switch的case中可以绑定一个或者多个值给case体中的临时常量或者变量,这个成为绑定值. 代码样例: let anotherPoint = (2, 0) switch anotherPoint { case (let x, 0):   println("on the x-axis with an x value of \(x)") case (0, let y):   println("on the y-axis with

Welcome to Swift (苹果官方Swift文档初译与注解二十九)---209~218页(第四章-- 流程控制)

Break break语句会立刻结束整个流程控制的执行.break语句可以在switch语句或者循环语句中帮助你提前结束循环或者switch的执行. Break in a Loop Statement  (循环语句中的break) 当在循环语句中使用break,会立刻结束循环的执行,并且跳转到循环体之后的第一行代码.循环不会再遍历执行了. Break in a Switch Statement (switch语句的break) 当在switch语句中使用break,break会立刻结速switc

Welcome to Swift (苹果官方Swift文档初译与注解二十二)---148~153页(第三章--集合类型)

在数组的指定索引位置插入一个元素,可以调用数组的insert(atIndex:)方法: shoppingList.insert("Maple Syrup", atIndex: 0) // shoppingList now contains 7 items // "Maple Syrup" is now the first item in the list” 例子中的insert方法在数组的开始位置(索引为0)插入一个新的元素,元素的值是"Maple Syr

Welcome to Swift (苹果官方Swift文档初译与注解二十六)---181~188页(第四章-- 流程控制)

Do-While  while循环的另一个版本是do-while循环,它在判断条件之前,先执行一遍循环体,然后再次执行循环体,直到条件成为false. do-while循环的通过格式: do {   statements } while condition 我们再用蛇和梯子的例子,使用do-while循环代替while循环.其中 finalSquare, board, square, 和 diceRoll 的初始化与while循环是一样的: let finalSquare = 25 var bo

Welcome to Swift (苹果官方Swift文档初译与注解二十四)---163~170页(第三章完--第四章 流程控制)

Mutability of Collections (可变集合) 字典和数组都是在一个集合里储存多个值.如果你创建数组或字典后赋值给一个变量,那么这个集合就是可变的( mutable).这就意味着你在创建这个集合之后,依然可以改变这个集合的 大小,添加元素到集合里或者删除已有的元素.相反地,如果你创建的数组或者字典赋值给一个常量,那么这个集合就是不能修改的,也就是说字典或者数组是不可变的(immutable) 对于字典,不可变就意味着你不能替换里面已有的键值对,一个不可变的字典在它一创建出来就是

Welcome to Swift (苹果官方Swift文档初译与注解十八)---116~122页(第二章)

Strings and Characters (字符串和字符) 字符串是一组字符组成的序列,例如“hello, world" 或 "albatross”.在Swift中,字符串使用String类型进行声明,它代表一组由Character(字符)类型组成的值的序列. String类型和Character类型提供了一种在代码中处理 (兼容Unicode) 文本的快速方式.字符串创建和管理的语法与C语言的相似,都属于轻量级并且可读性好.字符串的拼接只是简单的 使用加号(+)操作符,而且字符串