为什么这些上下文变量不可见?

时间:2015-09-17 13:48:02

标签: swift closures alamofire reactive-cocoa-3

我正在使用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 个答案:

答案 0 :(得分:0)

哇,经过几个小时的搜索,我找到了解决方案。

如果未明确分配给变量,外部闭包似乎不会保留变量(此处:接收器和一次性)。我这样做了

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

也许任何人都可以解释一下这一点更普遍?我认为外部闭合及其参数将自动在内部闭合内部可用。这可能是swift编译器中的一个错误吗?