¿Cómo almacenar un controller de finalización de cierre para llamar más tarde?

Estoy trabajando para convertir este tutorial en la compra de aplicaciones en Swift y he encontrado un problema para tratar de save el manejador de finalización. Necesitamos almacenar este controller de finalización para que se pueda llamar más tarde. No puedo entender cómo almacenar una copy del cierre de los arguments. Específicamente, creo que necesito copyrlo, pero Xcode dice que este object no tiene una function de copy.

Lo he definido así:

typealias RequestProductsCompletionHandler = (success: Bool, products: NSArray) -> Void 

Aquí declaro una propiedad para ello:

 var completionHandler: RequestProductsCompletionHandler? 

Entonces, aquí es donde necesito almacenar el controller de finalización pasado en mi propiedad:

 func requestProductsWithCompletionHandler(completionBlock: RequestProductsCompletionHandler) -> Void { //self.completionHandler = completionBlock.copy() //problem: RequestProductsCompletionHandler does not have a member named copy } 

Así es como se hizo en el tutorial Obj-C:

 typedef void (^RequestProductsCompletionHandler)(BOOL success, NSArray * products); RequestProductsCompletionHandler _completionHandler; - (void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler { _completionHandler = [completionHandler copy]; } 

Y luego se usa así:

 _completionHandler(YES, skProducts); _completionHandler = nil; 

EDIT: He eliminado el file .copy () para evitar el error (también tuve que hacer que el NSArray fuera opcional para poder configurarlo a cero más tarde). Mi pregunta es: ¿funcionará como se esperaba sin copyrlo explícitamente? No creo que lo haga porque Apple indicó que los cierres son types de reference . Esto almacenará una reference al cierre original que no quiero hacer. ¿Cómo se hace cumplir una copy?

Sí. Funcionará como se esperaba.

Cada vez que llame a requestProductsWithCompletionHandler , creará un cierre y lo pasará a esa function. Y como mencionó, cuando establece completionHandler , realmente lo configura como una reference al cierre dado.

En Objective C, para almacenar el bloque como ivar, tuvo que copyr un bloque. Esto se debe a que un bloque primero reside en la memory de la stack donde se definió. Y copy lo movió a la memory del montón para que se pueda usar