闭合下降通道导致EXC_BAD_INSTRUCTION故障



在我为使用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)
}

仅接受WUConditionResponseEVObject的一个特定子类。如果将该闭包强制转换为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)
}

最新更新