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:提到数组我们就会想到遍历,一般的遍历可能都是从头到尾进行的。但是如果你有特殊的需求呢。你可能不想呆板的进行遍历。这时候Generators就可以派上用场了。Generators的存在是进行特殊癖好的数组遍历,其筛选出符合该癖好的下标索引到数组没有元素为止。Self.Generator.Element就是在遍历的元素。

简化一下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,4,6]
// 例子2:用一个Int类型数组存储商品金额,想把每个金额后面添加一个字符“¥”,把数组转成字符串数组。如:[10,20,30,40] -> ["10¥","20¥","30¥","40¥"]
let moneyArray = [10,20,30,40]
let stringsArray = moneyArray.map{
    "\($0)¥"
}
print(stringsArray)
// 输出:["10¥","20¥","30¥","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, 58, 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", "FiveEight", "FiveOneZero"]

想要了解更多map,看这里Why coding like This ------ Map 函数揭秘

Optional Map

以下内容出自《Swifter》

假设要将某个Int?乘以2,一个合理的策略是如果这个Int?有值的话,就取出值进行乘以2的操作,如果是nil赋给结果。代码如下: 

let num: Int? = 3
var result: Int?
if let realNum = num {
    result = realNum * 2
} else {
    result = nil
}

其实我们有更优雅简洁的方式,那就是使用Optionalmap。对的,不仅仅在Array或者说CollectionType里可以用map,如果我们仔细看过Optional的声明的话,会发现它也有一个map方式:

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的方式进行判断,如果有值,则进入f的闭包进行变化,并返回一个U?;如果输入就是nil的话,则直接返回nilU?

有了这个方法,上面的代码就可以大大简化,而且result甚至可以使用常量值:

let num: Int? = 3
let result = num.map{
    $0 * 2
}
// result 为 {Some 6}

///



    let images =realm.objects(MainADItem.self).map { item -> String in

            return item.path

        }

        


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Swift 中,`map` 和 `flatMap` 是两个常用的高阶函数,用于处理数组(Array)或可选值(Optional)。 1. `map` 函数:`map` 函数可以将一个数组中的每个元素都应用一个转换函数,并返回一个新的数组,新数组的元素是原数组经过转换后的结果。例如: ```swift let numbers = [1, 2, 3, 4, 5] let doubledNumbers = numbers.map { $0 * 2 } print(doubledNumbers) // 输出 [2, 4, 6, 8, 10] ``` 在上面的例子中,`map` 函数将数组 `numbers` 中的每个元素都乘以 2,返回了一个新的数组 `doubledNumbers`。 2. `flatMap` 函数:`flatMap` 函数可以将一个数组中的每个元素都应用一个转换函数,然后将转换结果连接起来,并返回一个新的数组。与 `map` 不同的是,`flatMap` 还会自动过滤掉转换结果中的 `nil` 值(如果有的话)。例如: ```swift let names = ["Alice", "Bob", "Charlie"] let flattenedNames = names.flatMap { $0.uppercased() } print(flattenedNames) // 输出 ["A", "L", "I", "C", "E", "B", "O", "B", "C", "H", "A", "R", "L", "I", "E"] ``` 在上面的例子中,`flatMap` 函数将数组 `names` 中的每个元素都转换成大写字母,并将结果连接起来,得到了一个新的数组 `flattenedNames`。 需要注意的是,对于可选值(Optional),`flatMap` 函数还有另外一种用法。它可以将一个可选值进行解包,并返回其中的非空值,如果可选值为 `nil`,则返回一个空的数组。例如: ```swift let optionalNumber: Int? = 5 let flattenedNumber = optionalNumber.flatMap { [$0 * 2] } print(flattenedNumber) // 输出 [10] let nilOptionalNumber: Int? = nil let flattenedNilNumber = nilOptionalNumber.flatMap { [$0 * 2] } print(flattenedNilNumber) // 输出 [] ``` 在上面的例子中,`flatMap` 函数将可选值 `optionalNumber` 解包,并将解包后的非空值乘以 2,并返回一个包含该结果的数组。而对于 `nilOptionalNumber`,由于可选值为 `nil`,所以返回了一个空的数组。 希望这些示例能够帮助你理解 Swift 中 `map` 和 `flatMap` 的用法。如果你还有其他问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值