我要迭代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
答案 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
}
}
}
PurchaseManager
和SaleManager
是GenericManager
的子类,它们覆盖processFetchData(_:)
方法。
代码如下:
GenericType.allCases.forEach { genericType in
FetchManager.fetchItems(ofType: genericType, onSuccess: { data in
genericType.manager.processFetchData(data)
})
}
严格来说,我只将switch
语句从biz逻辑移到了enum
声明,但这使它更加优雅。