Use el bloque en el error de entrega rápida "Variable utilizada dentro de su propio valor inicial"

Este es mi código en obj-c

__block NSString *requestReference = [self operation:method url:url parameters:parameters headers:headers success:^(NSURLSessionDataTask *task, id responseObject) { NSError *error = [NSError errorWithSessionTask:task responseObject:responseObject]; if (error) { NSLog(@"error - %@", error); [delegate requestWithReference:requestReference didFinishWithBusinessError:error]; } else { id responseModel; if (modelClass && responseObject) { if ([responseObject isKindOfClass:[NSDictionary class]]) { // if response is a dictionary, create model out of it responseModel = [modelClass objectFromDictionary:responseObject error:&error]; } else if ([responseObject isKindOfClass:[NSArray class]]) { } } } } failure:^(NSURLSessionDataTask *task, NSError *error) { [delegate requestWithReference:requestReference didFailWithError:error]; }]; 

y este es el código después de la conversión en swift

 var requestReference = self.operation(method, url: url, parameters: parameters, headers: headers, success: {(_ task: URLSessionDataTask, _ responseObject: Any) -> Void in var error = Error(sessionTask: task, responseObject: responseObject) if error { print("error - \(error)") delegate.request(with: requestReference, didFinishWithBusinessError: error) } else { var responseModel: Any! if modelClass && responseObject { if (responseObject is [AnyHashable: Any]) { // if response is a dictionary, create model out of it do { responseModel = try modelClass.object(fromDictionary: responseObject) } catch { } } else if (responseObject is [Any]) { } } } }, failure: {(_ task: URLSessionDataTask, _ error: Error) -> Void in delegate.request(with: requestReference, didFailWithError: error) }) 

Me he convertido y creo este código. todo está funcionando en este código. Pero obtengo el error "Variable usado dentro de su propio valor inicial", cómo resolverlo.

Gracias

El comstackdor Swift es muy estricto y comtesting que cada variable tenga un valor definido antes de que se use. El comstackdor no sabe que en su caso, los cierres se ejecutarán solo después de que se haya definido la variable requestReference .

En tales casos, puede usar una opción implícitamente sin envolver :

 var requestReference: String! requestReference = self.operation(..., success: {(_ task: URLSessionDataTask, _ responseObject: Any) -> Void in // ... delegate.request(with: requestReference, didFinishWithBusinessError: error) }, failure: {(_ task: URLSessionDataTask, _ error: Error) -> Void in delegate.request(with: requestReference, didFailWithError: error) }) 

Un opcional implícitamente desenvuelto es una promise para el comstackdor: la variable no tiene valor ahora, pero tendrá un valor cuando se utiliza.

Definir primero, luego utilizarlo:

 var requestReference = "" requestReference = self.operation...