Swift学习笔记之数组(三)
数组重复值的初始化除了普通的初始化方法,我们可以通过 var threeDoubles = [Double](count:3,repeatedValue:0.0)
带索引值的遍历我们可以用 let arr = ["a","b"]
for(index,value) in enumerate(arr) {
println("(index):(value)")
} //0:a 1:b
赋值与拷贝Swift中数组和字典均是结构体的形式实现的,和 let hd = Resolution(width:1920,height:1000)
var cinema = hd
cinema.height =233
cinema //1920 233
hd //1920 1000
高阶函数Swift有一些Higher Order Function :map,filter和reduce。使用得当的话可以省去很多不必要的代码。 map‘map’可以把一个数组按照一定的规则转换成另一个数组,定义如下: func map<U>(transform:(T) -> U)-> U[]
也就是说它接受一个函数叫做 [x1,x2,...,xn].map(f) ->[f(x1),f(x2),f(xn)]
如果用 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]
如果你觉得 newArray = oldArray.map({"($0)¥"})
filter方法如其名, func filter(includeElement(T)->(T))
还是举个例子说明一下,首先看下传统的 var oldArray = [10,20,45,32]
var filteredArray :Aray<Int> = []
formoney 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
发现原来是 var oldArray = [10,32]
var filteredArray :Aray<Int> = []
formoney in oldArray {
if(money>30){
filteredArray += [money]
}
}
println(filteredArray) //[45,32]
(靠,,居然忘了贴 var oldArray = [10,32]
var filteredArray = oldArray.filter({
return $0>30
})
println(filteredArray) //[45,32]
你真的好短啊! reduce
func reduce<U>(initial :U,combine:(U,T)->U)
好吧看起来略抽象。我们还是从 var oldArray = [10,32]
var sum =0
for money in oldArray {
sum = sum + money
}
println(sum) //107
var oldArray = [10,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
sum = oldArray.reduce(0,+) //0+10+20+45+32 = 107
println(sum) //107
大概就是这些! 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。 Reference
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |