【问题标题】:Swift array map without $0 (Higher-Order Functions )没有 $0 的 Swift 数组映射(高阶函数)
【发布时间】:2020-12-23 11:39:20
【问题描述】:

我有一个函数可以在某些条件下生成一个数字

func randomWithCondition() -> Int {
  ...
  return n
}

稍后我将使用这个函数在另一个函数中构建一个长度为 N 的数组

func a() -> [Int] {
  var arr = [Int]()
  for _ in 0..<length {
    arr.append(randomWithCondition())
  }
  return arr
}

我想把这些写在一行中,我能想到的最好的事情是

return (0..<N).map { _ in randomWithCondition() }

因为我没有使用$0,所以必须加上_ in,否则编译不出来。

问题:有没有不写_ in的绕行?任何其他格式都可以,只要它是 return 语句中的一行。

【问题讨论】:

  • @JoakimDanielson 我会小心这种心态。这就是驱使 Java 程序员说“用 getter 和 setterceely 炸毁你的类有什么问题?我相信您可以将编程时间花在更重要的任务上。”客户的永恒不满非常有利于推动改进。

标签: arrays swift higher-order-functions


【解决方案1】:

map 将每个元素从其类型转换为其他类型,以便转换需要闭包中的参数。但为方便起见,您可以通过扩展 RangeClosedRange 来省略此参数:

extension Range where Bound: Strideable, Bound.Stride: SignedInteger {
    public func map<T>(_ transform: () -> T)  -> [T] {
        map { _ in transform() }
    }
}

extension ClosedRange where Bound: Strideable, Bound.Stride: SignedInteger {
    public func map<T>(_ transform: () -> T)  -> [T] {
        map { _ in transform() }
    }
}

let range = (0..<10).map { arc4random() }
print(range)
// Outputs: [676946806, 482060909, 1553829324, 1660236508, 606395000, 268649066, 1438948568, 1995527535, 918698113, 505678702]

let closedRange = (0...9).map { arc4random() }
print(closedRange)
// Outputs: [20467139, 198204705, 1585520963, 2022302907, 2518334206, 3304761403, 3782378335, 3830286797, 2200585433, 2387902936]

【讨论】:

    【解决方案2】:

    你需要自己定义一些额外的函数。

    例如,const 函数(名称灵感来自 Haskell,但您可以改为将其称为 withParameter):

    func const<T, U>(_ f: @escaping () -> U) -> ((T) -> U) {
        { _ in f() }
    }
    

    那么你可以这样做:

    return (0..<N).map(const(randomWithCondition))
    

    我认为您还应该将其包装在 generate 函数中:

    func generate<T>(_ count: Int, generator: @escaping () -> T) -> [T] {
        (0..<count).map(const(generator))
    }
    

    请注意,您也可以使用 sequence 创建惰性无限序列,而不是 mapping 范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多