Cada método em Swift possui uma função estática correspondente gerada automaticamente pelo Swift.
Mas estou tendo dificuldades para aplicar esse conceito map
.
Por exemplo. Esta é uma maneira canônica de fazer as coisas:
let numbers = Set([1, 2, 3])
let doubled = numbers.map { $0 * 2 }
print(doubled) // [2, 4, 6]
O que eu quero é fazer com que o código a seguir seja compilado e funcione (porque em teoria ele deveria compilar e funcionar exatamente como o código acima):
let numbers = Set([1, 2, 3])
let doubled = Set.map(numbers) { $0 * 2 }
print(doubled) // [2, 4, 6]
PS A propósito, como esse recurso é chamado oficialmente?
Supondo que você queira dizer o fato de que um método de instância como este:
também pode ser chamado como se fosse um método estático como este:
Isso é chamado de currying , mas apenas no primeiro parâmetro. Normalmente curry
foo
(acima) significariafunc foo() -> (C) -> (T1) -> (T2) -> R
. Veja também: https://stackoverflow.com/a/25375190/5133585Você pode usar a versão estática
map
assim:Observe que o extra
()
depois demap(numbers)
. Sem ele, o analisador pensaria que o encerramento é um argumento para aSet.map
chamada. É()
necessário deixar claro que o encerramento é um argumento para a função retornada pormap
. Você também não pode usar a sintaxe de encerramento final:Você também precisa
try
, porquemap
é declarado comrethrows
:Normalmente
rethrows
significa que setransform
não joga,map
também não joga. Mas como a versão estática demap
apenas pega aSet
e retorna a((Self.Element) throws -> T) -> [T]
, ela não pode saber se o fechamento que você vai passar é lançado ou não. Portanto, ele permanece do lado seguro e assume que irá lançar.