Swift学习笔记- 4.集合类型

数组

数组的简单语法

写数组应遵循 Array<SomeType> 这样的形式,也可以使用 [someType] 这样的简单语法。推荐使用更短的

数组构造语句

数组字面量: [value1, value2, value3]

var shoppingList: [String] = ["Eggs", "Milk”]

由于类型推断机制,当我们用字面量构造只拥有相同类型数值的时候,我们不必把数组的类型定义写清楚。还可以这么写:

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

访问和修改数组

(1)我们可以通过数组的方法和属性来访问和修改数组,或者下标语法。还可以用数组的制度属性 count 来获取数组中的数据项数量。

println("The shopping list contains \(shoppingList.count) items")

(2)使用 isEmpty 来检查数据项是否为0

if shoppingList.isEmpty {
    println("The shopping list is empty")
} else {
    println("The shopping list is not empty")
}

(3)可以使用 append 方法在数组后面添加新的数据项

shoppingList.append("Flour")

(4)使用 += 也可以在数组后添加一个或多个拥有相同类型的数据项:

shoppingList += ["Baking Powder"]
shoppingList += ["Chocolate Spread", "Cheese", "Butter"]

(5)可以使用下标语法来获取数据项,或修改某个索引值对应的数据值

var firstItem = shoppingList[0]

shoppingList[0] = "Six eggs"

(6)可以利用下标来一次改变一系列数据值,即使新数据和原有数据的数量不一样。

shoppingList[4...6] = ["Banana", "Apples"]

(7)调用 inser(atIndex:) 方法在某个具体索引值之前添加数据项

shoppingList.insert("Maple Syrup", atIndex: 0)

(8)同样也可以使用 removeAtIndex 方法来一出数组中的某一项。移除某一项,并返回被移除的数据项

let mapleSyrup = shoppingList.removeAtIndex(0)

let apples = shoppingList.removeLast()

数组的遍历

(1)通过 for in 循环遍历

for item in shoppingList {
    println(item)
}

(2)如果同时需要每个数据项的值和索引值,可以使用全局 enumerate 函数来进行数组遍历。enumerate 返回一个由每一个数据项索引值和数据值组成的元组。我们可以把这个元组分解成临时常量或者变量来进行遍历

for (index, value) in enumerate(shoppingList) {
    println("Item \(index + 1) : \(value)")
}

创建并构造一个数组

使用构造语法来创建一个空数组

var someInts = [Int]()
println("someInts is of type Int[] with \(someInts.count) items")

如果代码上下文中提供了类型信息,例如一个函数参数或一个已经定义好类型的常量或者变量,可以使用空数组语句创建一个空数组,写法很简单: [ ]

someInts.append(3)
someInts = []

Array 类型还提供一个可以创建特定大小并所有数据都被默认的构造方法。可以把准备加入新数组的数据项的数量(count)和适当类型的初始值(repeatedValue)传入数组构造函数:

var threeDoubles = [Double](count: 3, repeatedValue: 0.0)

因为类型推断,也可以直接这样写:

var anotherThreeDouble = Array(count: 3, repeatedValue: 2.5)

最后,可以使用 “ + ” 来组合两种已存在的相同类型数组。新数组的类型会从两个数组的数据类型中推断出来:

var sixDoubles = threeDoubles + anotherThreeDouble

字典

Swift 的字典使用时需要具体规定可以存储键和值的类型。

Swift 的字典使用 Dictionary<KeyType, ValueType> 定义,你也可以使用短语法 [KeyType: valueType].

定义字典:

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

var airports: [String: String] = ["TYO": "Tokyo", "DUB": "Dubliln"]

和数组一样,如果使用字面量构造字典就不用把类型定义清楚。airports 也可以这样定义:

var airports2 = ["TYO": "Tokyo", "DUB": "Dubliln”]

读取和修改字典

(1)和数组一样,可以通过字典的只读属性 count 来获取某个字典的数据项数量:

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

(2)使用 isEmpty 来判断 count 是否为0:

if airports.isEmpty {
    println("The airports dictionary is empty.")
} else {
    println("The airports dictionary is not empty.")
}

(3)我们也可以通过下标语法来添加新数据项,或者改变对应的数据项

airports["LHR"] = "London"

airports["LHR"] = "London Heathrow"

(4)updateValue(forKey:) 方法可以设置或者更新特定键对应的值。不过与下标方法不同的时,这个函数会返回更新值之前的原值。

updateValue(forKey:) 会返回包含一个字典值类型的可选值。

if let oldValue = airports.updateValue("Dublin International", forKey: "DUB") {
    println("The old value for DUB was \(oldValue)")
}

(5)可以使用下标语法在字典中检索特定值对应的值。如果该键对应的值存在,则返回值。否则返回 nil

if let airportName = airports["DUB"] {
    println("The name of the airport is \(airportName)")
} else {
    println("That airport is not in the airports dictionary")
}

(6)还可以使用下标语法来通过给某个键对应的值赋值为 nil 来从字典里移除一个键值对:

airports["APL"] = nil

(7)removeValueForKey 方法也可以用来在字典中移除键值对。这个方法在键值对存在的情况下会移除该键值对,并且返回被移除的 value 或在没有值的情况下返回 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")
}

遍历字典

 

我们可以使用for in 来遍历某个字典中的键值对。每一个字典中的数据项都有(key,value)元组形式返回,并且可以使用临时常量或变量来分解这些元组。

for(airportCode, airportName) in airports {
    println("\(airportCode):\(airportName)")
}

我们也可以通过访问它的 keys 或者 values 属性(都是可遍历集合)检索一个字典的键或值

for airportCode in airports.keys {
    println("Airport code: \(airportCode)")
}

for airportName in airports.values {
    println("Airport name: \(airportName)")
}

如果只是需要使用某个字典的键值对或者值集合来作为某个接受 Array 实例 API 的参数,可以使用 keys 或 values 属性直接构造一个新数组

let airportCodes = [String](airports.keys)
let airportNames = [String](airports.values)

创建一个空字典

我们也可以像数组一样使用构造语法创建一个空字典:

var namesOfIntegers = [Int: String]()

如果上下文已经提供了信息类型,我们可以使用空字典字面量来创建一个空字典,记作:[ : ]

namesOfIntegers[16] = "Sixteen"
namesOfIntegers = [:]

时间: 02-14

Swift学习笔记- 4.集合类型的相关文章

Swift学习笔记(二)参数类型

关于参数类型,在以前的编程过程中,很多时间都忽视了形参与实参的区别.通过这两天的学习,算是捡回了漏掉的知识. 在swift中,参数有形参和实参之分,形参即只能在函数内部调用的参数,默认是不能修改的,如果想要修改就需要在参数前添加var声明. 但这样的声明过后,仍旧不会改变实参的值,这样就要用到inout了,传递给inout的参数类型必须是var类型的,不能是let类型或者字面类型,(字面类型是在swift中常提的一个术语,个人认为就是赋值语句,也不能修改)而且在传递过程中,要用传值符号"&

swift 学习笔记:值类型and参考类型!

helloworld篇章 值: swift中类型分为两种:第一种是值类型,该类型的每个实例持有数据的副本,并且该副本对于每个实例来说是独一无二的一份,比如结构体(struct).枚举(enum).元组(tuple)都是值类型.第二种是参照类型,该类型的实例共享数据唯一的一份副本(在native层面说的话,就是该类型的每个实例都指向内存中的同一个地址),比如类(class)就是参照类型 如果你想创建一个新类型,那么你应该选择值类型还是参照类型呢?当你使用Cocoa框架时,很多API都是NSObje

Swift 学习笔记 enum 枚举类型

异端,异端啊,我感觉这是map吧? 1 enum ATMStatus { 2 case Success(Int) 3 case Error(String) 4 } 5 6 var balance = 200 7 8 func withdraw(amount: Int) -> ATMStatus { 9 if balance >= amount { 10 balance -= amount 11 return .Success(balance) 12 } else { 13 return .Er

swift学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型. 闭包和函数同属引用类型 捕获则为拷贝.捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值 class属于引用类型. Array的情况稍微复杂一些,下面主要对集合类型进行分析: 一.关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会

Swift学习笔记十:属性

1.存储属性       1. 作为特定类或结构实例的一部分,存储属性存储着常量或者变量的值.存储属性可分为变量存储属性(关键字var描述)和常量存储属性(关键字let描述). struct student{ let name = "" var score = 0 } let a = student(name:"小笨狼",score:96)           注意:                ① 定义储存属性时,需要为每一个属性定义一个默认值.在初始化的时候,

Swift学习笔记(4)--字符串及基本使用

String是例如"hello, world","海贼王" 这样的有序的Character(字符)类型的值的集合,通过String类型来表示. Swift 的String类型与 Foundation NSString类进行了无缝桥接.如果您利用 Cocoa 或 Cocoa Touch 中的 Foundation 框架进行工作.所有NSString API 都可以调用您创建的任意String类型的值.除此之外,还可以使用本章介绍的String特性.您也可以在任意要求传

Swift学习笔记:类和结构

一.类和结构的异同 类和结构有一些相似的地方,它们都可以: 1. 定义一些可以赋值的属性: 2. 定义具有功能性的方法 3. 定义下标,使用下标语法 4. 定义初始化方法来设置初始状态 5. 在原实现方法上的可扩展性 根据协议提供某一特定类别的基本功能 1. 类还有一些结构不具备的特性: 2. 类的继承性 3. 对类实例实时的类型转换 4. 析构一个类的实例使之释放空间 5. 引用计数,一个类实例可以有多个引用 1. 定义语法 struct Name{ let firstName = "&quo

SWIFT学习笔记05

1.Swift 无需写break,所以不会发生这种贯穿(fallthrough)的情况.2.//用不到变量名,可用"_"替换 for _ in 1...power { answer *= base } 3.case 可以匹配更多的类型模式,包括区间匹配(range matching),元组(tuple)和特定类型的描述. 可以这样用case case 1...3: naturalCount = "a few" 4.如果存在多个匹配,那么只会执行第一个被匹配到的 ca

SWIFT学习笔记02

1.//下面的这些浮点字面量都等于十进制的12.1875: let decimalDouble = 12.1875 let exponentDouble = 1.21875e1 let hexadecimalDouble = 0xC.3p0//==12+3*(1/16) 2.//类型别名,用typealias关键字来定义类型别名 typealias AudioSample = UInt16 var maxAmplitudeFound = AudioSample.min 3.//元组 let ht