Use block in Swift giving error “Variable used wit

2019-06-21 04:28发布

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"

2条回答
该账号已被封号
2楼-- · 2019-06-21 04:37

Define it first, then use it:

var requestReference = ""
requestReference = self.operation...
查看更多
时光不老,我们不散
3楼-- · 2019-06-21 04:48

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.

查看更多
登录 后发表回答