gpt4 book ai didi

swift - 使用 Array.map 而不是 array.map

转载 作者:搜寻专家 更新时间:2023-11-01 06:21:26 26 4
gpt4 key购买 nike

这是我可以在 Swift 中做的事情:

extension Int {
func square() -> Int { return self * self }
}

然后这样调用它:3.square() ,这给了我 9 .另外,我可以这样做:Int.square(3) , 它会给我 () -> (Int) .所以,Int.square(3)()给出 9 .

但是如果我写 let array = [1, 2, 3]; Array.map(array)它给出错误 Cannot convert value of type 'Array<Int>' to expected argument of type '[_]'

问题是,我如何以这种方式使用 Array.map?

编辑好的,我会尝试详细解释我的问题。现在,我有这样的功能:

func map<T, U>(f: T -> U) -> [T] -> [U] {
return { ts in
ts.map(f)
}
}

它有效,但仅适用于数组。有很多类型都有 map 函数,为每个类型都声明这样的全局函数并不是很好。因此,假设存在具有映射功能的类型 C C<T> -> (T -> U) -> C<U>

此外,假设我有函数 f , 变换 A -> B -> C进入B -> A -> C .

所以,看起来我可以做这样的事情:

let array = [1, 2, 3]
let square: Int -> Int = {$0 * $0}
map(square)(array) // [1, 4, 9], works fine
f(Array.map)(square)(array) // Error

问题不在于代码的可读性,而在于 Swift 的类型系统是如何工作的。

最佳答案

Array.map 函数定义为:

public func map<T>(self: [Self.Generator.Element]) -> (@noescape Self.Generator.Element throws -> T) rethrows -> [T]

这里的问题是编译器无法推断transform 函数或T 的返回类型。所以你必须通过以下两种方式来定义它:

// variable declaration
let mapping: (Int -> Int) throws -> [Int] = Array.map(array)

// or (especially useful for further function calls)
aFunction(Array.map(array) as (Int -> Int) throws -> [Int])

您还可以看到 map 函数被标记为 rethrows 如果您使用该函数,它会“翻译”为 throws。 (它看起来像一个错误,但闭包没有 rethrows,这可能是导致此行为的原因)。

所以函数 f 可能看起来像这样,以便与 Array.map 一起使用:

// where
// A is the array
// B is the function
// C the type of the returned array
func f<A, B, C>(f2: A -> (B throws -> C)) -> B -> (A throws -> C) {
return { b in
{ a in
try f2(a)(b)
}
}
}

// or with a forced try! so you don't have to use try
func f<A, B, C>(f2: A -> (B throws -> C)) -> B -> A -> C {
return { b in
{ a in
try! f2(a)(b)
}
}
}

// call f (use try if you use the first implementation)
let square: Int -> Int = {$0 * $0}
f(Array.map)(square)

关于swift - 使用 Array.map 而不是 array.map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33331479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com