swift: declaração de fechamento como declaração de bloco

90

Podemos declarar o bloco como abaixo em Objective-C.

typedef void (^CompletionBlock) (NSString* completionReason);

Estou tentando fazer isso no rapidinho, dá erro.

func completionFunction(NSString* completionReason){ }
typealias CompletionBlock = completionFunction

Erro: Uso de 'função de conclusão' não declarada

Definição:

var completion: CompletionBlock = { }

Como fazer isso?

Atualizar:

De acordo com a resposta de @jtbandes, posso criar um encerramento com vários argumentos, como

typealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani
fonte
1
@Downvotters: Explique o que há de errado com essa pergunta.
Mani de
1
há várias pessoas que acham que devemos primeiro aprender uma linguagem rápida e depois escrever. Sentimentos tolos ...
Janak Nirmal
@Mani Olá, você se importaria de mostrar também como atribuiria esse alias de tipo a a var(ou seja, var completion: CompletionBlock = {....}usando vários argumentos? Obrigado.
Unheilig

Respostas:

141

A sintaxe para os tipos de função é (in) -> out.

typealias CompletionBlock = (NSString?) -> Void
// or
typealias CompletionBlock = (result: NSData?, error: NSError?) -> Void
var completion: CompletionBlock = { reason in print(reason) }
var completion: CompletionBlock = { result, error in print(error) }

Observe que os parênteses em torno do tipo de entrada são necessários apenas a partir do Swift 3+.

jtbandes
fonte
Se forem necessários mais de dois argumentos, como podemos fazer isso? Você poderia me indicar referências nesse livro ou em qualquer outro?
Mani de
Melhor livro para Swift: Apple Inc. “The Swift Programming Language”. iBooks. itun.es/ca/jEUH0.l
David Skrundz
@NSArray Eu sei que apenas um livro está disponível para o Swift. Mas estou perguntando sobre aquele capítulo correspondente com tópico ... :)
Mani
4
@jtbandes Está funcionando. Eu criei com dois argumentos comotypealias CompletionBlock = ( completionName : NSString, flag : Int) -> ()
Mani
@zumzum Separa o nome do parâmetro " reason" do corpo do método " println(reason)"
jtbandes
13

Aqui está um blog incrível sobre fechamento rápido.

aqui estão alguns exemplos:

Como variável:

var closureName: (inputTypes) -> (outputType)

Como uma variável opcional:

var closureName: ((inputTypes) -> (outputType))?

Como um alias de tipo:

typealias closureType = (inputTypes) -> (outputType)
BLC
fonte