ios - 在 Swift 中使用 block 给出错误 "Variable used within its own initial value"

标签 ios swift swift3 closures

这是我在 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]; }];

这是在 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)
})

我已经转换并提出了这段代码。 一切都在这段代码中工作 但我收到错误:

"Variable used within its own initial value"

最佳答案

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

隐式展开的可选是对编译器的 promise : 该变量现在没有值,但在使用时会有值。

关于ios - 在 Swift 中使用 block 给出错误 "Variable used within its own initial value",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41285496/

相关文章:

ios - 当点击 UIcollectionviewcell 放大单元格照片并打开新的 View Controller 时

ios - 使用 Alamofire 下载视频,然后在 AV 播放器上播放

android - 在移动应用程序中结合 html 前端和 python "back-end"

ios - 以编程方式将 ScrollView 滚动到其底部

ios - 在某些单元格上禁用 UITableView 滚动

swift - 将数据传递到上一个 View 而不使用segue,@IBaction swift

ios - 如何以编程方式将图像设置为在每个设备上具有相同的相对大小和位置?

ios - 快速聚焦文本字段

swift - 如何配置UICollectionView的maxCellSpacing?

ios - 如何在 xCode 中保存一组 UIimages (swift)