Swift 错误 - 线程 1:EXC_BAD_INSTRUCTION

Posted

技术标签:

【中文标题】Swift 错误 - 线程 1:EXC_BAD_INSTRUCTION【英文标题】:Swift Error - Thread1: EXC_BAD_INSTRUCTION 【发布时间】:2017-11-09 22:39:06 【问题描述】:

在 Xcode 9 中运行我的代码后,我得到一个 Thread1: EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP,subcode=0x0)。该代码在 Xcode 8 中运行良好。

 class func loadDataFromURL(_ url: URL, completion:@escaping (_ data: Data?, _ error: NSError?) -> Void) 
    let session = URLSession.shared

    // Use NSURLSession to get data from an NSURL
    let loadDataTask = session.dataTask(with: url, completionHandler:  (data: Data?, response: URLResponse?, error: NSError?) -> Void in
        if let responseError = error 
            completion(nil, responseError)
         else if let httpResponse = response as? HTTPURLResponse 
            if httpResponse.statusCode != 200 
                let statusError = NSError(domain:"Domain", code:httpResponse.statusCode, userInfo:[NSLocalizedDescriptionKey : "HTTP status code has unexpected value."])
                completion(nil, statusError)
             else 
                completion(data, nil)
            
        
     as! (Data?, URLResponse?, Error?) -> Void)  //Thread1: EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP,subcode=0x0)

    loadDataTask.resume()

我正在尝试从 url 加载数据,我不知道为什么会收到此错误。谢谢。

【问题讨论】:

EXC_BAD_INSTRUCTION 表示您的 as! 转换在运行时失败。 你为什么还要投射你的完成处理程序?从字面上看,没有理由这样做。如果演员表有效,则不需要,如果需要,它将在运行时失败(正如您刚刚发现的那样) 看起来您正在投射,因为您的完成处理程序使用 NSError?不要那样做。只需使用Error 【参考方案1】:

不要强制转换,只需使用正确的语法,闭包中没有类型注释,最后也没有类型转换:

let loadDataTask = session.dataTask(with: url, completionHandler:  (data, response, error) in
    // code
)

【讨论】:

以上是关于Swift 错误 - 线程 1:EXC_BAD_INSTRUCTION的主要内容,如果未能解决你的问题,请参考以下文章

SWIFT 线程 1:EXC 错误指令 XCODE IOS

将代码更新为最新的 Swift 4 语法会导致“线程 1:致命错误:索引超出范围”错误

swift:致命错误:在展开可选值(lldb)时意外发现 nil,线程 1

Swift:线程 1:信号 SIGABRT

Swift 错误 - 线程 1:EXC_BAD_INSTRUCTION

iOS Swift IBKS 信标错误:线程 1:致命错误:在展开可选值时意外发现 nil