在快速给出错误中使用块"在其自己的初始值内使用变量"

com*_*iks 5 closures ios swift swift3

这是我在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]; }];
Run Code Online (Sandbox Code Playgroud)

这是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)
})
Run Code Online (Sandbox Code Playgroud)

我已经转换并提出了这段代码.一切都在这个代码中工作但我收到错误"变量在其自己的初始值内使用"如何解决这个问题.

谢谢

Mar*_*n R 7

Swift编译器非常严格,在使用之前检查每个变量是否都有定义的值.编译器不知道你的情况,封盖将只执行 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)
})
Run Code Online (Sandbox Code Playgroud)

隐式展开的可选项是对编译器的承诺:变量现在没有值,但在使用时它将具有值.