当前位置: 首页 > 编程笔记 >

Swift心得笔记之集合类型

东门文斌
2023-03-14
本文向大家介绍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。

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

 类似资料:
  • 本文向大家介绍Swift心得笔记之运算符,包括了Swift心得笔记之运算符的使用技巧和注意事项,需要的朋友参考一下 空值合并运算符和区间运算符 今天主要看的内容是 Swift 中的基本运算符。记录一下。 Nil Coalescing Operator a ?? b 中的 ?? 就是是空值合并运算符,会对 a 进行判断,如果不为 nil 则解包,否则就返回 b 。 使用的时候有以下两点要求: a 必

  • 本文向大家介绍Swift中内置的集合类型学习笔记,包括了Swift中内置的集合类型学习笔记的使用技巧和注意事项,需要的朋友参考一下 一、引言 Swift中提供了3种集合类型,Array数据类型,Set集合类型,Dictionary字典类型。Array用于存放一组有序的数据,数据角标从0开始一次递增;Set用于存放一组无序的数据,数据不可以重复;Dictionary也用于存放一组无序的数据,只是其是

  • 本文向大家介绍Swift学习笔记之元组(tuples),包括了Swift学习笔记之元组(tuples)的使用技巧和注意事项,需要的朋友参考一下 元组 元组(tuples)是由其它类型组合而成的类型。元组可能包含零或多个类型,比如 字符串、整数、字符、布尔以及其它元组。同时请注意,元组是值传递,而不是引用。 在Swift中创建元组的方式很简单,元组类型是用括号包围,由一个逗号分隔的零个或多个类型的列

  • 关于开发的学习笔记合集,包括 Apple 开发、静态库、动态库相关、Object-C、React-Native 开发等

  • 本文向大家介绍Web前端新人笔记之jquery入门心得(新手必看),包括了Web前端新人笔记之jquery入门心得(新手必看)的使用技巧和注意事项,需要的朋友参考一下 本章将为大家介绍以下几点内容; 1、jquery的主要特点; 2、建立jquery的编码环境; 3、简单jquery脚本示例; 4、选择jquery而不是纯javaScript的理由; 5、常用的jquery开发工具;jquery能

  • 本文向大家介绍Swift学习笔记之构造器重载,包括了Swift学习笔记之构造器重载的使用技巧和注意事项,需要的朋友参考一下 与函数一样,方法也存在重载,其重载的方式与函数一致。那么作为构造器的特殊方法,是否也存在重载呢?答案是肯定的。 一、构造器重载概念 Swift中函数重载的条件也适用于构造器,条件如下: 函数有相同的名字; 参数列表不同或返回值类型不同,或外部参数名不同; Swift中的构造器

  • 本文向大家介绍Lua学习笔记之数据类型,包括了Lua学习笔记之数据类型的使用技巧和注意事项,需要的朋友参考一下 从本篇博客开始研究一下Lua,现在的Lua真得是很火,因为Cocos2d-x写游戏的时候会用到,所以就拿过来学学吧,先从基础的语法开始,然后慢慢的深入。本人也是刚刚学习,希望和学习Lua的大家交流,博客权当笔记,有错误之处还请赐教。 当然首先是开发环境了,我的学习背景是Cocos2d-x

  • 本文向大家介绍JavaScript 学习笔记之数据类型,包括了JavaScript 学习笔记之数据类型的使用技巧和注意事项,需要的朋友参考一下 一、分类 基本数据类型:undefined、null、string、Boolean、number 复杂数据类型:object object的属性以无序的名称和值对的形式 (name : value) 来定义 二、详解 1、undefined:undefin