文章目录
  1. 1. 原文代码
  2. 2. 代码段说明
  3. 3. 其他

原文地址:Functional Snippet #1: Decomposing Arrays

原文代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
extension Array {
var decompose : (head: T, tail: [T])? {
return (count > 0) ? (self[0], Array(self[1..<count])) : nil
}
}
func sum(xs: [Int]) -> Int {
if let (head, tail) = xs.decompose {
return head + sum(tail)
} else {
return 0
}
}
var xs: [Int] = [1, 2, 3]
let result = sum(xs)
result //result=6

代码段说明

  • 定义Array的扩展只读存储属性decompose,是一个tuple可选(元组),head代表头部元素,tail代表除掉头部的剩余数组部分,如果是空数组,则赋值为nil
  • 注意Array(self[1..<count]),只有一个元素的数组,返回[]:空数组
  • 注意headtail都使用泛型定义。
  • sum函数使用decompose拆包,递归调用自身实现Int数组的值求和功能。

其他

文中提到,同理,可以用以上思路对DictionaryString进行扩展,下面是我的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
extension Dictionary {
var decompose : (head: (Key, Value), tail: [Key : Value])? {
var headValue: (Key, Value)? = nil
var tailDictionary: [Key : Value] = [Key : Value]()
if count > 0 {
var tempIndex = 0
for (key, value) in self {
if tempIndex == 0 {
tempIndex = 1
headValue = (key, value)
continue
}
tailDictionary[key] = value
}
return (headValue!, tailDictionary)
}
return nil
}
}
func sumDic(dic: [String : Int]) -> Int {
if let (head, tail) = dic.decompose {
return head.1 + sumDic(tail)
} else {
return 0
}
}
var dic: [String : Int] = [String : Int]()
dic["1"] = 2
dic["2"] = 32
dic["3"] = 2
dic["4"] = 32
sumDic(dic) //=68
文章目录
  1. 1. 原文代码
  2. 2. 代码段说明
  3. 3. 其他