swift 的高阶函数的使用代码

 1 //: Playground - noun: a place where people can play
 2 
 3 import UIKit
 4 
 5 var str = "Hello, playground"
 6 
 7 /// 使用map函数,进行数组内部数据的转换,map中接受一个转换函数
 8 var array =  [1,2,3,4,5]
 9 var newArray = array.map({$0 * 2})
10 print(newArray)
11 
12 
13  /// 使用reduce 函数 求和
14 var sum = array.reduce(0, combine: +)
15 print(sum)
16 
17 
18 /// 使用 filter来验证tweet中是否包含选定的若干关键字中的一个
19 let words = ["Swift","iOS","cocoa","OSX","tvOS"]
20 let tweet = "This is an example tweet larking about Swift"
21 let valid = !words.filter({tweet.containsString($0)}).isEmpty
22 print(valid)
23 
24 let valid1 = words.contains(tweet.containsString)
25 print(valid1)
26 
27 let valid2 = tweet.characters.split(" ").lazy.map(String.init).contains(Set(words).contains)
28 print(valid2)
29 
30 
31  /// 使用split map 分隔内容
32 let text = "窗前明月光 疑是地上霜 举头望明月 低头思故乡"
33 let lines = text.characters.split(" ").map(String.init)
34 print(lines[0])
35 print(lines[1])
36 print(lines[2])
37 print(lines[3])
38 
39 
40 /// 使用forEach 高阶函数便利
41 let name = "urai"
42 (1...4).forEach({print("Happy Birthday " + (($0 == 3) ? "dear \(name)":"to You"))})
43 (1...4).forEach{print("Happy Birthday " + (($0 == 3) ? "dear \(name)":"to You"))}
44 
45 
46 // MARK: - 查找数组中符合条件的数据
47 extension SequenceType {
48     
49     typealias Element = Self.Generator.Element
50     
51     func partitionBy(fu: (Element) -> Bool) -> ([Element],[Element]) {
52         
53         var first = [Element]()
54         var second = [Element]()
55         
56         for el in self {
57             
58             if fu(el) {
59                 
60                 first.append(el)
61             }
62             else {
63                 
64                 second.append(el)
65             }
66         }
67         return (first,second)
68     }
69 }
70 
71 let part = [82, 58, 76, 49, 88, 90].partitionBy{$0 < 60}
72 print(part)
73 
74 // MARK: - 一种更简介的查找方式
75 extension SequenceType {
76     
77     func anotherpartitionBy(fu: (Self.Generator.Element) -> Bool) -> ([Self.Generator.Element],[Self.Generator.Element]) {
78         
79         return (self.filter(fu),self.filter({!fu($0)}))
80     }
81 }
82 
83 let part1 = [82, 58, 76, 49, 88, 90].anotherpartitionBy{$0 < 60}
84 print(part1)
85 
86 /// 使用的是分区元组,但效率不如上边的高
87 var part2 = [82, 58, 76, 49, 88, 90].reduce( ([],[]), combine: {
88     (a:([Int],[Int]),n:Int) -> ([Int],[Int]) in
89     (n<60) ? (a.0+[n],a.1) : (a.0,a.1+[n])
90 })
91 print(part2)

代码

posted @ 2016-04-29 15:21  马在路上  阅读(473)  评论(0编辑  收藏  举报