在我为使用WeatherUnderground而编写的一个类中,我需要许多与此函数几乎相同的函数,在这种形式下,这些函数可以很好地工作C:
func currentConditions(completion: (result: WUConditionResponse?) -> Void) -> Request {
url = urlBuilder("conditions")
let request = Alamofire.request(.GET, url)
.validate()
.responseObject { (response: Result<WUConditionResponse, NSError>) in
completion(result: response.value)
}
return request
}
我没有把它们都单独写,而是尝试了这个:
private typealias AFCompletion = (result: EVObject?) -> Void
private func current(command: String, onCompletion: AFCompletion) -> Request {
let function = {(completion: AFCompletion) -> Request in
self.url = self.urlBuilder(command)
let request = Alamofire.request(.GET, self.url)
.validate()
.responseObject { (response: Result<EVObject, NSError>) in
completion(result: response.value!)
}
return request
}
return function(onCompletion)
}
紧随其后的是
func currentConditions(completion: (result: WUConditionResponse?) -> Void) -> Request {
let myCompletion = completion as! AFCompletion
return current("conditions", onCompletion: myCompletion)
}
其中CCD_ 1是CCD_。然后,我将结构与语句一起使用,与工作内容保持不变:
foo.currentConditions { (conditions: WUConditionResponse?) in
print(conditions)
}
通过这种方式,我在向下转换到AFCompletion时出现EXC_BAD_INSTRUCTION
故障。我看不出这个问题。为什么向下转换出错?尽管答案完整,但我如何进一步调试?
这是不可能的,你试图做到这一点
foo.currentConditions { (conditions: WUConditionResponse?) in
print(conditions)
}
仅接受WUConditionResponse
,EVObject
的一个特定子类。如果将该闭包强制转换为AFCompletion
,则生成的闭包必须接受每个EVObject
,而不是。
所能做的是创建第二个仅调用completion
的对象,前提是实际传入的对象类型正确,而不是强制转换:
func currentConditions(completion: (result: WUConditionResponse?) -> Void) -> Request {
let myCompletion : AFCompletion = { res in
if res != nil || res! is WUConditionResponse {
return completion(res as! WUConditionResponse?)
}
return false // default return
}
return current("conditions", onCompletion: myCompletion)
}