如何在flatMap中使用Swift实例方法?

时间:2019-01-21 05:49:20

标签: swift functional-programming flatmap

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

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实例方法与全局函数一起使用?

1 个答案:

答案 0 :(得分:1)

使用实例方法,您不能。

实例方法是一种咖喱方法,类型(String) -> () -> Array<String>的意思是“方法接受字符串并返回不包含任何内容的函数并返回字符串数组”。

因此您可以这样做,但不能在编写时如此。

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"]