逃逸闭包捕获了非逃逸参数分发。

3
我遇到了错误: Escaping closure captures non-escaping parameter dispatch。这个错误在MovieService().getMovies这一行出现。
typealias ActionCreator = (_ dispatch: (Action) -> (), _ getState: () -> AppState) -> ()

func fetchMovies() -> ActionCreator   {
    
    return { dispatch, getState in
        
        MovieService.getMovies(url: "http://www.omdbapi.com/?s=Batman&page=2&apikey=YOURKEY") { result in
            
            switch result {
            case .success(let movies):
                if let movies = movies {
                    dispatch(.populateMovies(movies))
                }
            case .failure(let error):
                print(error.localizedDescription)
            }
            
        }
    }
    
}

有什么想法吗?

1个回答

4
根据 闭包 文档:

当将闭包作为函数参数传递并在函数返回后调用闭包时,闭包被认为是逃逸出函数的。当您声明一个以闭包作为参数之一的函数时,您可以在参数类型之前写 @escaping 来表示允许闭包逃逸。

默认情况下,闭包是非逃逸(即 nonescaping),就像你的 dispatch 参数一样。但是你正在一个 escaping 的闭包中调用它,这个 escaping 闭包可能就是你在 getMovies 函数中传递的那个函数。
解决方法很简单,只需在 dispatch 参数类型前添加 @escaping:
typealias ActionCreator = (_ dispatch: @escaping (Action) -> (), _ getState: () -> AppState) -> ()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接