Swift心得笔记之集合类型_Swift

数组

重复值的初始化

除了普通的初始化方法,我们可以通过 init(count: Int, repeatedValue: T) 来初始化一个数组并填充上重复的值:

复制代码 代码如下:

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

带索引值的遍历

我们可以用 for in 遍历数组,如果想要 index 的话,可以用 enumerate<Seq : SequenceType>(base: Seq) :

复制代码 代码如下:

let arr = ["a","b"]
for (index, value) in enumerate(arr) {
    println("\(index):\(value)")
}
// 0:a
// 1:b

赋值与拷贝

Swift 中数组和字典均是结构体的形式实现的,和 NSArray 那一套不太一样,所以赋值的时候其实是给了一份拷贝:

复制代码 代码如下:

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.height = 233
cinema  // 1920 233
hd      // 1920 1080

高阶函数

Swift 有一些 Higher Order Functions :map、filter和reduce。使用得当的话可以省去很多不必要的代码。

map

map 可以把一个数组按照一定的规则转换成另一个数组,定义如下:

复制代码 代码如下:

func map<U>(transform: (T) -> U) -> U[]

也就是说它接受一个函数叫做 transform ,然后这个函数可以把 T 类型的转换成 U 类型的并返回 (也就是 (T) -> U),最终 map 返回的是 U 类型的集合。

下面的表达式更有助于理解:

复制代码 代码如下:

[ x1, x2, ... , xn].map(f) -> [f(x1), f(x2), ... , f(xn)]

如果用 for in 来实现,则需要这样:

复制代码 代码如下:

var newArray : Array<T> = []
for item in oldArray {
    newArray += f(item)
}

举个例子,我们可以这样把价格数组中的数字前面都加上 ¥ 符号:

复制代码 代码如下:

var oldArray = [10,20,45,32]
var newArray = oldArray.map({money in "¥\(money)"})
println(newArray) // [¥10, ¥20, ¥45, ¥32]

如果你觉得 money in 也有点多余的话可以用 $0 :

复制代码 代码如下:

newArray = oldArray.map({"\($0)?"})

filter

方法如其名, filter 起到的就是筛选的功能,参数是一个用来判断是否筛除的筛选闭包,定义如下:

复制代码 代码如下:

func filter(includeElement: (T) -> Bool) -> [T]

还是举个例子说明一下。首先先看下传统的 for in 实现的方法:

复制代码 代码如下:

var oldArray = [10,20,45,32]
var filteredArray : Array<Int> = []
for money in oldArray {
    if (money > 30) {
        filteredArray += money
    }
}
println(filteredArray)

奇怪的是这里的代码编译不通过:

复制代码 代码如下:

Playground execution failed: <EXPR>:15:9: error: 'Array<Int>' is not identical to 'UInt8'
        filteredArray += money

发现原来是 += 符号不能用于 append ,只能用于 combine ,在外面包个 [] 即可:

复制代码 代码如下:

var oldArray = [10,20,45,32]
var filteredArray : Array<Int> = []
for money in oldArray {
    if (money > 30) {
        filteredArray += [money]
    }
}
println(filteredArray) // [45, 32]

(靠。。居然忘了贴 filter 的用法,写到后面才发现。。)

用 filter 可以这样实现:

复制代码 代码如下:

var oldArray = [10,20,45,32]
var filteredArray  = oldArray.filter({
    return $0 > 30
})
println(filteredArray) // [45, 32]

你真的好短啊!

reduce

reduce 函数解决了把数组中的值整合到某个独立对象的问题。定义如下:

复制代码 代码如下:

func reduce<U>(initial: U, combine: (U, T) -> U) -> U

好吧看起来略抽象。我们还是从 for in 开始。比如我们要把数组中的值都加起来放到 sum 里,那么传统做法是:

复制代码 代码如下:

var oldArray = [10,20,45,32]
var sum = 0
for money in oldArray {
    sum = sum + money
}
println(sum) // 107

reduce 有两个参数,一个是初始化的值,另一个是一个闭包,闭包有两个输入的参数,一个是原始值,一个是新进来的值,返回的新值也就是下一轮循环中的旧值。写几个小例子试一下:

复制代码 代码如下:

var oldArray = [10,20,45,32]
var sum = 0
sum = oldArray.reduce(0,{$0 + $1}) // 0+10+20+45+32 = 107
sum = oldArray.reduce(1,{$0 + $1}) // 1+10+20+45+32 = 108
sum = oldArray.reduce(5,{$0 * $1}) // 5*10*20*45*32 = 1440000
sum = oldArray.reduce(0,+) // 0+10+20+45+32 = 107
println(sum)

大概就是这些。

map 用来解包可选类型

我们在解包可选类型的时候,通常会这么做:

复制代码 代码如下:

func increment(someNumber: Int?) -> Int? {
    if let number = someNumber {
        return number + 1
    } else {
        return nil
    }
}
increment(5)   // Some 6
increment(nil) // nil

我们也可以用 map 来实现:

复制代码 代码如下:

func increment(someNumber: Int?) -> Int? {
    return someNumber.map { number in number + 1 }
}

increment(5)   // Some 6
increment(nil) // nil

包括其他可选类型也是可行的,比如 String :

复制代码 代码如下:

func hello(someName: String?) -> String? {
    return someName.map { name in "Hello, \(name)"}
}
hello("NatashaTheRobot") // Some "Hello, NatashaTheRobot"
hello(nil) // nil

再搭配上 ?? 符号,嗯基本够用了:

复制代码 代码如下:

func hello(someName: String?) -> String {
    return someName.map { name in "Hello, \(name)" } ?? "Hello world!"
}

hello("NatashaTheRobot") // "Hello, NatashaTheRobot"
hello(nil)               // "Hello world!"

扩展

数组和字典十分常用,而官方的方法功能有限。我们可以学习ExSwift 中 Array.swift 的内容,给 Array 添加一些 Extension。

以上所述就是本文的全部内容了,希望大家能够喜欢。

时间: 2024-10-25 06:49:24

Swift心得笔记之集合类型_Swift的相关文章

Swift语法专题五——集合类型

Swift讲解专题五--集合类型 一.引言         Swift中提供了3种集合类型,Array数据类型,Set集合类型,Dictionary字典类型.Array用于存放一组有序的数据,数据角标从0开始一次递增:Set用于存放一组无序的数据,数据不可以重复:Dictionary也用于存放一组无序的数据,只是其是按照键值对的方式存储,键值必须唯一.这里借用官方文档中的一张图来表示3种集合类型的特点: 二.Array类型         Array通常也被称为数组,Swift是一种类型安全语言

Swift心得笔记之控制流_Swift

控制流基本上大同小异,在此列举几个比较有趣的地方. switch Break 文档原文是 No Implicit Fallthrough ,粗暴的翻译一下就是:不存在隐式贯穿.其中 Implicit 是一个经常出现的词,中文原意是:"含蓄的,暗示的,隐蓄的".在 Swift 中通常表示默认处理.比如这里的隐式贯穿,就是指传统的多个 case 如果没有 break 就会从上穿到底的情况.再例如 implicitly unwrapped optionals ,隐式解析可选类型,则是默认会进

Swift心得笔记之运算符_Swift

空值合并运算符和区间运算符 今天主要看的内容是 Swift 中的基本运算符.记录一下. Nil Coalescing Operator a ?? b 中的 ?? 就是是空值合并运算符,会对 a 进行判断,如果不为 nil 则解包,否则就返回 b . var a: String? = "a" var b: String? = "b" var c = a ?? b // "a" a = nil c = a ?? b // "b"

Swift心得笔记之函数_Swift

参数 外部变量名 一般情况下你可以不指定外部变量名,直接调用函数: 复制代码 代码如下: func helloWithName(name: String, age: Int, location: String) {     println("Hello \(name). I live in \(location) too. When is your \(age + 1)th birthday?") } helloWithName("Mr. Roboto", 5, &

Swift心得笔记之字符串_Swift

字符串 简介 String 中的字符串是值类型,传递的时候会对值进行拷贝,而 NSString 的字符串传递则是引用.我们可以用 for in 遍历字符串: 复制代码 代码如下: var a : String = "a" for c in "Hello" {     println(c) } 可以通过 countElements 计算字符串的字符数量: 复制代码 代码如下: countElements("1234567") // 7 不过要注意的

Swift学习笔记之构造器重载_Swift

与函数一样,方法也存在重载,其重载的方式与函数一致.那么作为构造器的特殊方法,是否也存在重载呢?答案是肯定的. 一.构造器重载概念 Swift中函数重载的条件也适用于构造器,条件如下: 函数有相同的名字: 参数列表不同或返回值类型不同,或外部参数名不同: Swift中的构造器可以满足以下两个条件,代码如下: 复制代码 代码如下: class Rectangle {     var width : Double     var height : Double     init(width : Do

Swift教程之集合类型详解_Swift

Swift 提供两种集合类型来存储集合,数组和字典.数组是一个同类型的序列化列表集合.字典是一个能够使用类似于键的唯一标识符来获取值的非序列化集合. 在Swift中,数组和字典的键和值都必须明确它的类型.这意味这数组和字典不会插入一个错误的类型的值,以致于出错.这也意味着当你在数组和字典中取回数值的时候能够确定它的类型. Swift 使用确定的集合类型可以保证代码工作是不会出错,和让你在开发阶段就能更早的捕获错误. note: Swift的数组 储存不同的类型会展示出不同的行为,例如变量,常量或

Swift中内置的集合类型学习笔记_Swift

一.引言 Swift中提供了3种集合类型,Array数据类型,Set集合类型,Dictionary字典类型.Array用于存放一组有序的数据,数据角标从0开始一次递增:Set用于存放一组无序的数据,数据不可以重复:Dictionary也用于存放一组无序的数据,只是其是按照键值对的方式存储,键值必须唯一.这里借用官方文档中的一张图来表示3种集合类型的特点: 二.Array类型 Array通常也被称为数组,Swift是一种类型安全语言,其中的Array类型也必须确定其元素的类型,声明数组类型有两种方

详解Swift中的Characters字符类型与String字符串类型_Swift

一.引言 Swift中提供了String类型与Characters类型来处理字符串和字符数据,Swift中的String类型除了提供了许多方便开发者使用的方法外,还可以与Foundation框架的NSString类进行转换,使用起来十分方便. 二.String基础 在Swift中,使用双引号来定义字符串,开发者可以通过如下代码来创建一个字符串常量: let str = "Hello, playground" 可以通过下面两种方式来创建空字符串: let str1 = "&qu