Почему эти переменные контекста не видны?
Я использую 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)
}
}
}
}
Может быть, кто-нибудь может объяснить это более общим? Я думал, что внешнее закрытие с его параметрами будет доступно во внутреннем закрытии автоматически. Может ли это быть ошибкой в быстром компиляторе?