Я могу определить глобальную функцию, которая удваивает строки:
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 так же, как и с глобальной функцией?