let array = [1, 2, 3, 4, 5]
现在有需求将array里的元素全部变成字符串
func convertString(_ array: [Int]) -> [String] {
var result = [String]()
for item in array {
result.append(String(item))
}
return result
}
现在有需求将数组里的全部元素*2
func convertString(_ array: [Int]) -> [Int] {
var result = [Int]()
for item in array {
result.append(item * 2)
}
return result
}
现在有需求将数组里的全部元素 + 10
....复制上面代码,改一点点.
可以通过系统map函数做到.
但是下面就自己写一个map函数当做学习
也是给Array做个扩展
从上面的各种需求来看,其实就是拿到数组里的每一个元素做处理
就从这开始着手:
定义一个泛型函数,函数需要返回什么类型,有调用者自己决定.
- 函数有一个参数,是一个block类型,这个block里会将数组的元素当做参数带出去,拿* 到这个参数需要做什么处理有调用者自己决定(就像上面的需求一样,或是乘以2 或是变成字符串,或者干嘛,随意)
- block还有一个返回值,返回值是泛型类型,就是你拿到数组元素处理完以后的类型.
- 函数还有一个返回值,返回的是一个数组,就是处理完每一个元素以后得到的新值,数组类型也是有处理时的类型决定,也是一个泛型
extension Array {
public typealias element = Array.SubSequence.Element
func customMap<T>(_ transform: (element) -> T) -> [T] {
var result = [T]()
for item in self {
result.append(transform(item))
}
return result
}
}
使用:
[1,2,3,4,5].customMap({$0 * 2})
[1,2,3,4,5].customMap { (item) -> String in
return String(item)
}
学习笔记.