源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Swift心得笔记之集合类型

  • 时间:2022-01-27 01:23 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Swift心得笔记之集合类型
[b]数组[/b] 重复值的初始化 除了普通的初始化方法,我们可以通过 init(count: Int, repeatedValue: T) 来初始化一个数组并填充上重复的值:
[u]复制代码[/u] 代码如下:
// [0.0,0.0,0.0] var threeDoubles = [Double](count:3,repeatedValue:0.0)
带索引值的遍历 我们可以用 for in 遍历数组,如果想要 index 的话,可以用 enumerate<Seq : SequenceType>(base: Seq) :
[u]复制代码[/u] 代码如下:
let arr = ["a","b"] for (index, value) in enumerate(arr) {     println("\(index):\(value)") } // 0:a // 1:b
[b]赋值与拷贝[/b] Swift 中数组和字典均是结构体的形式实现的,和 NSArray 那一套不太一样,所以赋值的时候其实是给了一份拷贝:
[u]复制代码[/u] 代码如下:
let hd = Resolution(width: 1920, height: 1080) var cinema = hd cinema.height = 233 cinema  // 1920 233 hd      // 1920 1080
[b]高阶函数[/b] Swift 有一些 Higher Order Functions :map、filter和reduce。使用得当的话可以省去很多不必要的代码。 map map 可以把一个数组按照一定的规则转换成另一个数组,定义如下:
[u]复制代码[/u] 代码如下:
func map<U>(transform: (T) -> U) -> U[]
也就是说它接受一个函数叫做 transform ,然后这个函数可以把 T 类型的转换成 U 类型的并返回 (也就是 (T) -> U),最终 map 返回的是 U 类型的集合。 下面的表达式更有助于理解:
[u]复制代码[/u] 代码如下:
[ x1, x2, ... , xn].map(f) -> [f(x1), f(x2), ... , f(xn)]
如果用 for in 来实现,则需要这样:
[u]复制代码[/u] 代码如下:
var newArray : Array<T> = [] for item in oldArray {     newArray += f(item) }
举个例子,我们可以这样把价格数组中的数字前面都加上 ¥ 符号:
[u]复制代码[/u] 代码如下:
var oldArray = [10,20,45,32] var newArray = oldArray.map({money in "¥\(money)"}) println(newArray) // [¥10, ¥20, ¥45, ¥32]
如果你觉得 money in 也有点多余的话可以用 $0 :
[u]复制代码[/u] 代码如下:
newArray = oldArray.map({"\($0)�"})
filter 方法如其名, filter 起到的就是筛选的功能,参数是一个用来判断是否筛除的筛选闭包,定义如下:
[u]复制代码[/u] 代码如下:
func filter(includeElement: (T) -> Bool) -> [T]
还是举个例子说明一下。首先先看下传统的 for in 实现的方法:
[u]复制代码[/u] 代码如下:
var oldArray = [10,20,45,32] var filteredArray : Array<Int> = [] for money in oldArray {     if (money > 30) {         filteredArray += money     } } println(filteredArray)
奇怪的是这里的代码编译不通过:
[u]复制代码[/u] 代码如下:
Playground execution failed: <EXPR>:15:9: error: 'Array<Int>' is not identical to 'UInt8'         filteredArray += money
发现原来是 += 符号不能用于 append ,只能用于 combine ,在外面包个 [] 即可:
[u]复制代码[/u] 代码如下:
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 可以这样实现:
[u]复制代码[/u] 代码如下:
var oldArray = [10,20,45,32] var filteredArray  = oldArray.filter({     return $0 > 30 }) println(filteredArray) // [45, 32]
你真的好短啊! reduce reduce 函数解决了把数组中的值整合到某个独立对象的问题。定义如下:
[u]复制代码[/u] 代码如下:
func reduce<U>(initial: U, combine: (U, T) -> U) -> U
好吧看起来略抽象。我们还是从 for in 开始。比如我们要把数组中的值都加起来放到 sum 里,那么传统做法是:
[u]复制代码[/u] 代码如下:
var oldArray = [10,20,45,32] var sum = 0 for money in oldArray {     sum = sum + money } println(sum) // 107
reduce 有两个参数,一个是初始化的值,另一个是一个闭包,闭包有两个输入的参数,一个是原始值,一个是新进来的值,返回的新值也就是下一轮循环中的旧值。写几个小例子试一下:
[u]复制代码[/u] 代码如下:
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)
大概就是这些。 [b]map 用来解包可选类型[/b] 我们在解包可选类型的时候,通常会这么做:
[u]复制代码[/u] 代码如下:
func increment(someNumber: Int?) -> Int? {     if let number = someNumber {         return number + 1     } else {         return nil     } } increment(5)   // Some 6 increment(nil) // nil
我们也可以用 map 来实现:
[u]复制代码[/u] 代码如下:
func increment(someNumber: Int?) -> Int? {     return someNumber.map { number in number + 1 } } increment(5)   // Some 6 increment(nil) // nil
包括其他可选类型也是可行的,比如 String :
[u]复制代码[/u] 代码如下:
func hello(someName: String?) -> String? {     return someName.map { name in "Hello, \(name)"} } hello("NatashaTheRobot") // Some "Hello, NatashaTheRobot" hello(nil) // nil
再搭配上 ?? 符号,嗯基本够用了:
[u]复制代码[/u] 代码如下:
func hello(someName: String?) -> String {     return someName.map { name in "Hello, \(name)" } ?? "Hello world!" } hello("NatashaTheRobot") // "Hello, NatashaTheRobot" hello(nil)               // "Hello world!"
[b]扩展[/b] 数组和字典十分常用,而官方的方法功能有限。我们可以学习ExSwift 中 Array.swift 的内容,给 Array 添加一些 Extension。 以上所述就是本文的全部内容了,希望大家能够喜欢。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部