【问题标题】:Closure downcast causes EXC_BAD_INSTRUCTION fault关闭向下转换导致 EXC_BAD_INSTRUCTION 错误
【发布时间】:2016-05-14 18:04:22
【问题描述】:

在我编写的一个使用 Wea​​therUnderground 的类中,我需要许多与此函数几乎相同的函数,在这种形式下可以正常工作:

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

其中WUConditionResponseEVObject 的子类。然后,我将构造与语句一起使用,与工作内容相同:

    foo.currentConditions { (conditions: WUConditionResponse?) in
        print(conditions)
    }

通过这种方式,我在向下转换到 AFCompletion 时收到 EXC_BAD_INSTRUCTION 错误。我不知所措。为什么沮丧的故障?尽管有完整的答案,我该如何进一步调试?

【问题讨论】:

    标签: ios swift2 alamofire


    【解决方案1】:

    这不可能按照您尝试的方式进行。你传入的闭包

    foo.currentConditions { (conditions: WUConditionResponse?) in
        print(conditions)
    }
    

    接受 WUConditionResponseEVObject 的一个特定子类。如果您将该闭包转换为 AFCompletion,则生成的闭包必须接受 every 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)
    }
    

    【讨论】:

    • 我认为您解决了问题,但修复不起作用。较小的问题是它仍然中止,尽管有不同的消息和 SIGABT,但尽管存在剥离类型信息导致 EVReflection 不再看到 WUConditionResponse 中的元素,因此 JSON 不会填充的问题它。我最初的策略是尝试构建一个泛型作为函数生成器,但失败了,因为 args 不包含泛型的类型。抛开学习机会不谈,我认为可能是时候回去强行使用它了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2017-08-17
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多