如何在Swift中编写适用于所有类型的地图?

时间:2015-09-30 11:50:46

标签: swift swift2

作为练习,我正在实现一个map函数,它接受一个数组和一个函数,并将该函数应用于数组的所有元素,但我不知道如何声明它使它适用于任何类型的阵列。 我可以做点像

func intMap(var arr: [Int], fun: (Int) -> Int) -> [Int] {
    for i in 0 ..< arr.count {
        arr[i] = fun(arr[i])
    }
    return arr
}

intMap([1,2,3], {x in return x * x})

但这仅适用于int。

Swift内置地图的类型签名是什么?

编辑:

所以我错过了这样一个事实:我可以声明param类型签名而不明确声明它们的类型。

func myMap<T>(var arr: [T], fun: (T) -> T) -> [T] {
    for i in 0 ..< arr.count {
        arr[i] = fun(arr[i])
    }
    return arr
}

myMap([1,2,3], fun: {
    x in return x * x
})

1 个答案:

答案 0 :(得分:2)

  • 制作新的游乐场
  • 位于import UIKit类型import Swift
  • 之下
  • 命令点击 Swift

这将打开Swift库,你可以看到那里的所有类型定义。

你可以看到:

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]

已编辑添加

或者,您可以编写更通用的地图

func myMap<T, U>(var arr: [T], fun: T -> U) -> [U] {
    var a: [U] = []
    for i in 0 ..< arr.count {
        a.append(fun(arr[i]))
    }

    return a
}

返回一个可能不同类型的新数组,您可以通过将它放在游乐场中自行查看。

let a = [1, 2, 3]
let b = myMap(a, fun: { x in Double(x) * 2.1 })
a
b