Как получить доступ к параметрам закрытия конфликта с более высокого уровня закрытия - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу выполнить итерацию enum, а затем использовать $ 0 в операторе switch/case на один уровень в замыкании, которое вызывается в операции выборки внутри цикла итерации enum, следующим образом:

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 голосов
/ 28 сентября 2018

Опираясь на @Alexander и ответ / ввод @ Daniel, я реализовал цикл for без оператора switch-case.

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 декларация, но это делает ее немного более элегантной.

0 голосов
/ 28 сентября 2018

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