如何从更高的闭包级别访问隐式闭包参数

时间:2018-09-27 22:11:58

标签: swift arguments closures

我要迭代enum,然后在switch/case迭代循环内的访存操作中调用的闭包中的下一层的enum语句中使用$ 0,如下所示:

enum GenericType: CaseIterable {
    case purchase
    case sale
    // etc....
}

然后使用的代码如下:

GenericType.allCases.forEach {
    // let type = $0
    Manager.fetchItems(ofType: $0, onSuccess: { (data) in
        switch $0 {
        case purchase:
        // Do something
        case sale:
        // Do something
    }                                               
}

Xcode 10假设$0引用了data(闭包中的参数),并给出了以下错误消息:

Anonymous closure arguments cannot be used inside a closure that has explicit arguments; did you mean 'data'?

在提取之前我就可以使用它:

let type = $0

然后在type语句中使用switch/case

是否有一种方法可以从闭包内部的更高级别上下文访问$0速记参数?解决方法是否可行?

Thx

2 个答案:

答案 0 :(得分:4)

$0只能引用“链上”的第一个闭包上下文。要访问外部闭包的参数,您需要为其命名:

GenericType.allCases.forEach { genericType in
    Manager.fetchItems(ofType: genericType, onSuccess: { data in
        switch genericType {
        case .purchase: return
            // Do something
        case .sale: return
            // Do something
        }
    })
}

答案 1 :(得分:0)

以@Alexander和@Daniel的答案/输入为基础,这是我在没有switch-case语句的情况下实现for循环的方式。

enum GenericType: CaseIterable {
    case purchase
    case sale
    var manager: GenericManager {
        switch self {
        case .purchase:
            return PurchaseManager.shared
        case .sale:
            return SalesManager.shared
        }
    }
}

PurchaseManagerSaleManagerGenericManager的子类,它们覆盖processFetchData(_:)方法。

代码如下:

GenericType.allCases.forEach { genericType in
    FetchManager.fetchItems(ofType: genericType, onSuccess: { data in
        genericType.manager.processFetchData(data)
    })
}

严格来说,我只将switch语句从biz逻辑移到了enum声明,但这使它更加优雅。