2016-12-22 7 views
5

यह Obj सीउपयोग

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

मैं में रूपांतरण के बाद कोड है बदल दिया है और इस कोड के साथ आ गया है। सब कुछ इस कोड में काम कर रहा है लेकिन मुझे त्रुटि मिल रही है "वैरिएबल अपने शुरुआती मूल्य के भीतर प्रयोग किया जाता है" इसे कैसे हल करें।

धन्यवाद

+1

आप यह शामिल करना चाहते हैं कि समस्या 'अनुरोध रेफरेंस' है, जिसे चर परिभाषित किया जा रहा है, लेकिन सफलता और विफलता ब्लॉक दोनों में भी इसका उपयोग किया जाता है। – luk2302

उत्तर

7

स्विफ्ट संकलक बहुत सख्त है और जांच करता है कि हर चर एक परिभाषित महत्व है इससे पहले कि यह प्रयोग किया जाता है। कंपाइलर यह नहीं जानता कि आपके मामले में, बंद होने पर requestReference चर के बाद बंद कर दिया जाएगा।

ऐसे मामलों में आप उपयोग कर सकते हैं एक परोक्ष वैकल्पिक unwrapped: चर अब कोई मूल्य नहीं है, लेकिन यह एक होगा:

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

एक परोक्ष unwrapped वैकल्पिक संकलक करने के लिए एक वादा है जब इसका उपयोग किया जाता है तो मूल्य।

+0

"कंपाइलर यह नहीं पहचानता है कि आपके मामले में, बंद होने के बाद ही बंद कर दिया जाएगा संदर्भ संदर्भ परिभाषित किया गया है।" इसकी कोई गारंटी नहीं है। पैरामीटर के नामों के आधार पर हम केवल * मानते हैं, कि फ़ंक्शंस को अतुल्यकालिक रूप से निष्पादित किया जाता है, लेकिन तकनीकी रूप से यह सिंक्रनाइज़ तरीके से निष्पादित करने के तरीके के लिए पूरी तरह कानूनी है। फिर संकलक इस तरह की धारणा नहीं करने का अधिकार है। – newacct

+0

@ न्यूवाक्ट आप सही हैं। मैंने शब्द बदल दिया है। प्रतिक्रिया के लिए धन्यवाद! –

0

यह पहली बार परिभाषित करें, तो यह उपयोग करें:

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