【问题标题】:How to use a swift Instance method with flatMap?如何在 flatMap 中使用 swift Instance 方法?
【发布时间】:2019-06-14 11:55:23
【问题描述】:

我可以定义一个将字符串加倍的全局函数:

func double(string: String) -> [String] {
  return [string, string]
}

现在可以将它与 flatMap 一起使用

let animals = ["Ant", "Bear", "Cat"]
print( animals.flatMap(double) ) // ["Ant", "Ant", "Bear", "Bear", "Cat", "Cat"]

但我们不喜欢 Globals ;-) 所以我改为扩展字符串:

extension String {
  func double() -> [String] {
    return [self, self]
  }
}

但我不能像我得到的那样使用它:

print( animals.flatMap(String.double) ) // [(Function), (Function), (Function)]

我可以看出问题在于类型不同。

print("type(of: double) = \(type(of: double))") //type(of: double) = (String) -> Array<String>
print("type(of: String.double) = \(type(of: String.double))") //type(of: String.double) = (String) -> () -> Array<String>

我可以看到 String.double 不是 flatMap 的正确类型,我收到的警告消息强调了这一点:

'flatMap' 已弃用:请使用 compactMap(_:) 闭包返回一个可选值

我认为这是因为编译器没有为 flatMap 找到合适的重载。

如何像使用全局函数一样使用 flatMap 的实例方法?

【问题讨论】:

标签: swift functional-programming flatmap


【解决方案1】:

使用实例方法,你不能。

实例方法是一种柯里方法,(String) -&gt; () -&gt; Array&lt;String&gt; 类型的意思是“一个方法接受字符串并返回一个不接受任何内容并返回字符串数组的函数”。

所以你可以这样做,但不能像你写的那样。

print(animals.flatMap{ String.double($0)() }) // ["Ant", "Ant", "Bear", "Bear", "Cat", "Cat"]

你需要的是一个静态方法。它只是接受字符串并返回字符串数组。

extension String {
    static func double(_ string: String) -> [String] {
        return [string, string]
    }
}

print(animals.flatMap(String.double)) // ["Ant", "Ant", "Bear", "Bear", "Cat", "Cat"]

【讨论】:

  • 不错@taka - 整洁。如果我不想弄乱我的实例方法,我可以这样做: extension String { static func double(_ string: String) -> [String] { return string.double() } } 然后按照您的示例进行操作。谢谢。
猜你喜欢
  • 2018-09-15
  • 1970-01-01
  • 2021-06-21
  • 2019-02-08
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
相关资源
最近更新 更多