上下文闭包类型 Response<AnyObject> -> void 需要 1 个 agrument,但 3 个在闭包主体中
Posted
技术标签:
【中文标题】上下文闭包类型 Response<AnyObject> -> void 需要 1 个 agrument,但 3 个在闭包主体中【英文标题】:Contextual closure type Response<AnyObject> -> void expects 1 agrument but 3 were in closure body 【发布时间】:2016-09-12 08:05:07 【问题描述】:这段代码在 ios 8 和 swift 2.0 上完全可以运行我之前的项目。
这是我的代码:
let url=NSURL(string: _resourceURL)!
Alamofire.request(.GET ,url).responseJSON (request : NSURLRequest?,response: NSHTTPURLResponse?, result: Result<AnyObject> ) -> void in
print(result.value.debugDescription)
现在我尝试使用 iOS 9、Swift 3.0、alamofire 4.0.0 但抛出以下错误:
泛型类型“结果”专用于太少的类型参数(得到 1,但预期为 2) 使用未声明的类型“void” 上下文闭包类型 'Response -> Void' 需要 1 个参数,但在闭包主体中使用了 3 个
【问题讨论】:
Result<AnyObject, NSError>
@ozgur 这将修复泛型类型错误但是,应该只有一个参数,并且应该是 Response<AnyObject, NSError>
类型
【参考方案1】:
如果您没有需要将 JSON 转换为的特定对象,并且您乐于通过键访问属性,则可以这样做:
Alamofire.request(.GET, url).responseJSON response in
if let JSON = response.result.value
print("JSON: \(JSON)")
【讨论】:
【参考方案2】:Alamofire 的乐于助人的精灵写了一个简洁但不可或缺的migration guide,包括“之前/之后”风格的代码 sn-ps。基于这些,您需要对代码执行一些操作才能使用 AF 4.0:
-
以
String
(AF 扩展以符合其自己的URLConvertible
协议)的形式传入您的url,而不是作为NSURL。
切换URL的顺序和方法。 ...
...Swift 3 切换到小写枚举 (SE-006),因此该方法在 AF 4+ 中为小写。 ...
...当我们使用它时,.get
是默认方法,因此我们可以完全放弃它。
URLResponse
和 URLRequest
不再有 NS 前缀。
切换到新的DataResponse
类型,其中包含我们的朋友result
、request
和response
。
所以工作代码可能如下所示:
// resourceURL
let url = "http://www.example.com/endpoint"
Alamofire.request(url).responseJSON dataResponse in
guard
let request = dataResponse.request,
let response = dataResponse.response
else fatalError("Don't ship me, debug me, master!")
print(dataResponse.result.value.debugDescription)
这是在 XCode 8GM 中编译的,但我没有运行它(没有真正的端点),所以一粒粒的盐等等。
【讨论】:
以上是关于上下文闭包类型 Response<AnyObject> -> void 需要 1 个 agrument,但 3 个在闭包主体中的主要内容,如果未能解决你的问题,请参考以下文章
根据闭包上下文的要求,返回类型“future<bool>”不是“Future<bool>”
上下文闭包类型 '(Data?, URLResponse?, Error?) -> Void' 需要 3 个参数,但 1 在闭包主体中使用
如何修复上下文闭包类型 '((String, JSON), (String, JSON)) -> Bool' 需要 2 个参数,但在闭包体中使用了 1 个?