简体   繁体   中英

Use block in Swift giving error “Variable used within its own initial value”

This is my code in 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]; }];

and this is the code after conversion in 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)
})

I have converted and come up with this code. everything is working in this code But I'm getting error:

"Variable used within its own initial value"

The Swift compiler is very strict and checks that every variable has a defined value before it is used. The compiler does not know that in your case, the closures will be executed only after the requestReference variable is defined.

In such cases you can use an implicitly unwrapped optional:

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

An implicitly unwrapped optional is a promise to the compiler: The variable has no value now, but it will have a value when it is used.

Define it first, then use it:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM