2016-12-22 1 views
5

Это мой код в Obj-CИспользуйте блок в скор дает ошибку «Variable используется в пределах своей первоначальной стоимости»

__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]; }]; 

и это код, после преобразования в быстрой

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) 
}) 

I преобразовали и придумали этот код. все работает в этом коде Но я получаю ошибку «Переменная, используемая в пределах своего собственного начального значения» как решить эту проблему.

Благодаря

+1

Возможно, вы захотите включить, что проблема заключается в 'requestReference', которая является определяемой переменной, но также используется как в случае успеха, так и в блоке отказов. – luk2302

ответ

7

Свифт компилятор очень строга и проверяет, что каждая переменная имеет определенное значение, прежде чем она используется. Компилятор не знает, что в вашем случае замыкания будут выполняться только после определяется переменная requestReference.

В таких случаях вы можете использовать неявно разворачивал дополнительно:

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) 
}) 

Для неявно развернутого необязательно обещания компилятора: переменные не имеет значения сейчас,, но это будет иметь значение, когда оно используется.

+0

"компилятор не признает, что в вашем случае замыкания будут выполняться только после того, как будет определена переменная requestReference." Это не гарантирует. Мы только * предполагаем *, основываясь на именах параметров, что функции выполняются асинхронно, но технически это совершенно законно для того, чтобы метод выполнял их синхронно, если захочет. Тогда компилятор прав, чтобы не делать такого предположения. – newacct

+0

@newacct Вы правы. Я изменил формулировку. Спасибо за ответ! –

0

определить его, а затем использовать его:

var requestReference = "" 
requestReference = self.operation... 
Смежные вопросы