Почему эти переменные контекста не видны?

Я использую Swift 1.2 с ReactiveCocoa 3.0, SwiftyJSON 2.2.1 и Alamofire 1.3.1. Я строю реактивный сетевой менеджер.

Почему следующее не работает?

func sendRequest(request: ApiRequest) -> SignalProducer<JSON, NSError> {

    return SignalProducer { sink, disposable in
        alamofireManager.request(request.method, request.url, parameters:request.parameters, encoding: .JSON).responseJSON
            { (request, response, data, error) in
                if let error = error {
                    // sendError(sink, error)
                } else {
                    NSLog("Successful network request")
                    // sendNext(observer, JSON(data!))
                    // sendCompleted(sink)
                }
        }
    }
}

sendError, sendNext и sendCompleted не компилируются. Когда они не комментируются, компилятор говорит:

Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1

При отладке я вижу, что раковина и одноразовые изделия не видны внутри крышки Alamofire. Самое странное: раньше это работало несколько часов назад.

1 ответ

Решение

Вау, после нескольких часов поиска я нашел решение.

Кажется, что внешнее замыкание не сохраняет переменных (здесь: сток и одноразовые), если не назначено переменной явно. Я сделал это с

let sink = sink

Следующие работы:

func sendRequest(request: ApiRequest) -> SignalProducer<JSON, NSError> {
    return SignalProducer { sink, disposable in
        let sink = sink

        self.alamofireManager.request(request.method, request.url, parameters:request.parameters, encoding: .JSON).responseJSON
            { (request, response, data, error) in
                if let error = error {
                    sendError(sink, error)
                } else {
                    sendNext(sink, JSON(data!))
                    sendCompleted(sink)
                }
        }
    }
}

Может быть, кто-нибудь может объяснить это более общим? Я думал, что внешнее закрытие с его параметрами будет доступно во внутреннем закрытии автоматически. Может ли это быть ошибкой в ​​быстром компиляторе?

Другие вопросы по тегам