swift map
CollectionType Map在CollectionType的extension中map方法的定义: extension CollectionType {
/// Return an `Array` containing the results of mapping `transform`
/// over `self`.
///
/// - Complexity: O(N).
@warn_unused_result
@rethrows public func map<T>(@noescape transform: (Self.Generator.Element) throws -> T) rethrows -> [T]
...
}
@warn_unused_result:表示如果没有检查或者使用该方法的返回值,编译器就会报警告。 @noescape:用在函数的闭包参数上,意味着这个参数是唯一可被调用的(或者用在函数调用时以参数的方式出现),其意思是它的生命周期比函数调用的周期短,这有助于一些小小的性能优化,但最重要的是它屏蔽了闭包中对self.的需求。这使得函数的控制流比其他更加透明。 throws:可以抛出一个错误的函数或方法必需使用 throws 关键字标记。这些函数和方法被称为抛出异常函数(throwing fu nctions)和抛出异常方法(throwing methods)。 rethrows:一个函数或方法可以使用 rethrows 关键字来声明,从而表明仅当这个函数或方法的一个函数参数抛出错误时这个函数或方法才抛出错误。这些函数和方法被称为重抛出异常函数(rethrowing functions)和重抛出异常方法(rethrowing methods)。重抛出异常函数或方法必需有至少一个抛出异常函数参数。 Generator:提到数组我们就会想到遍历,一般的遍历可能都是从头到尾进行的。但是如果你有特殊的需求呢。你可能不想呆板的进行遍历。这时候 简化一下map的定义: func map<T>(transform: (Self.Generator.Element) -> T) -> [T]
可以看到,map 方法返回的是一个数组,其获取一个闭包表达式作为唯一参数,集合中的每个元素调用一次该闭包函数,并返回该元素所映射的值(也可以是不同类型的值)。具体的映射方式和返回值类型由闭包来指定。 看几个简单例子: // 例子1:对一个Int类型数组的元素进行2倍放大。如:[1,2,3]->[2,4,6]。
let arr = [1,2,3]
let doubled = arr.map{
$0 * 2
}
print(doubled)
// 输出:[2,6]
// 例子2:用一个Int类型数组存储商品金额,想把每个金额后面添加一个字符“¥”,把数组转成字符串数组。如:[10,20,30,40] -> ["10¥","20¥","30¥","40¥"]
let moneyArray = [10,40]
let stringsArray = moneyArray.map{
"($0)¥"
}
print(stringsArray)
// 输出:["10¥","40¥"]
// 例子3: 将Int类型数组转换为包含对应String类型的数。如:[16,58,510] -> ["OneSix","FiveEight","FiveOneZero"]。
let digitNames = [
0: "Zero",1: "One",2: "Two",3: "Three",4: "Four",5: "Five",6: "Six",7: "Seven",8: "Eight",9: "Nine"
]
let numbers = [16,510]
let strings = numbers.map{
(var number) -> String in
var output = ""
while number > 0 {
output = digitNames[number % 10]! + output
number /= 10
}
return output
}
print(strings)
// 输出:["OneSix","FiveOneZero"]
想要了解更多map,看这里Why coding like This —— Map 函数揭秘 Optional Map以下内容出自《Swifter》 假设要将某个 let num: Int? = 3
var result: Int?
if let realNum = num {
result = realNum * 2
} else {
result = nil
}
其实我们有更优雅简洁的方式,那就是使用Optional的 public enum Optional<Wrapped> : _Reflectable,NilLiteralConvertible {
...
/// If `self == nil`,returns `nil`. Otherwise,returns `f(self!)`.
@warn_unused_result
@rethrows public func map<U>(@noescape f: (Wrapped) throws -> U) rethrows -> U?
...
}
这个方法能让给我们很方便的对一个Optional值做变化和操作,而不必进行手动的解包工作。输入会被自动用类似Optional Binding的方式进行判断,如果有值,则进入 有了这个方法,上面的代码就可以大大简化,而且 let num: Int? = 3
let result = num.map{
$0 * 2
} // result 为 {Some 6}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |