Swift 3 数组map方法示例解析

map 函数的原型如下:

func map<U>(transform: (T) -> U) -> [U]

我们可以看到该函数使用了泛型。 (T) -> U 是一个泛型闭包,它的意思就是类型 T 将会在闭包中进行逻辑处理,然后返回 U 类型。最后 map 函数会返回一个 U 类型的数组

通俗地讲:

数组的 map 方法 它的参数就是一个闭包,它会将数组里的每一个元素放在闭包中进行处理,然后返回一个新的数组,甚至是与原数组不同元素类型的新数组

示例

func greetPeople(person: String) -> String
{
    return "Hello, \(person)!"
}

let guestList = ["Chris", "Jill", "Tim"]
let fullGreetings = guestList.map(greetPeople)
print(fullGreetings) // ["Hello, Chris!", "Hello, Jill!", "Hello, Tim!"]

数组的 map 方法 它的参数是一个闭包,为什么可以传入一个函数???

Swift中的函数就是闭包

闭包有三种形式:
        
1. 全局函数是一个有名字但不会捕获任何值的闭包。
        
2. 嵌套函数是一个有名字并可以捕获到其封闭函数域内的值的闭包。
        
3. 闭包表达式是一个利用轻量级语法所写的,可以捕获其上下文中变量或常量值的匿名闭包。

将一个全局函数 greetPeople 作为一个闭包来使用的
将 greetPeople 函数作为 guestList 数组的 map 函数的参数传入,并返回一个新的数组 fullGreetings

1.闭包表达式其实是函数的字面值,官方一般称之为匿名函数.一般当我们需要使用函数快速的实现一个简短的处理逻辑并且只使用一次的时候,我们可以省去函数名
可以直接使用闭包表达式来处理

let fullGreetings = guestList.map({(person: String) -> String 
    in return "Hello, \(person)!"
})

2.Swift中有类型推断的特性,所以我们可以去掉参数类型

let fullGreetings = guestList.map({(person) -> String in
    return "Hello, \(person)!"
})

3.编译器可以根据 in 之前的返回值类型和 return 之后的返回数据类型自动判断,所以我们可以省略返回值和 return 关键字

let fullGreetings = guestList.map({person in
    "Hello, \(person)!"
})

4.Swift中还提供了参数的简写方式: $0 代表第一个参数、 $1 代表第二个参数以此类推。所以我们又可以将参数名称省略

let fullGreetings = guestList.map ({ "Hello,\($0)"})

5.当函数的最后一个参数是闭包时,可以将闭包写在 () 之外,这也是Swift的一个特性,所以我们还可以继续简化

let fullGreetings = guestList.map(){ "Hello, \($0)!" }

6.当函数有且仅有一个参数,并且该参数是闭包时,不但可以将闭包写在 () 外,还可以省略 ()

let fullGreetings = guestList.map{ "Hello, \($0)!" }

小练习

// 例子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类型数组转换为包含对应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 { ( num ) -> String in
            var output = ""
            var new = num
            while new > 0 {
                output = digitNames[new % 10]! + output
                new /= 10
            }
            return output
        }
print(strings)
// 输出:["OneSix", "FiveEight", "FiveOneZero"]

参考文章
1.Swift中的闭包(Closure)
2.Swift Map方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 1,470评论 1 5
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,957评论 1 10
  • 本章将会介绍 闭包表达式尾随闭包值捕获闭包是引用类型逃逸闭包自动闭包枚举语法使用Switch语句匹配枚举值关联值原...
    寒桥阅读 1,587评论 0 3
  • 梅妆初过,眉如远山故画作,罗衫轻解云端卧。剪妆翠红,丁香樱桃破。 蕙带袖雪醪浥涴,红茸却向村夫唾。十年浣花求一诺...
    不无草堂主人阅读 225评论 3 4
  • 看到别人转这个觉得真的写的挺实在的,圈子不同道理确是相通的。 就我自己而言,感觉很多时候大范围掐架其实是可以避免的...
    青桃十三宇阅读 657评论 0 0