【问题标题】:BAD_INSTRUCTION within swift closureBAD_INSTRUCTION 迅速关闭
【发布时间】:2014-06-04 14:49:05
【问题描述】:
func loadMe() -> Void {
    println(me.initUrl());

    let url:NSURL = NSURL(string:me.initUrl())
    let request:NSURLRequest = NSURLRequest(URL:url)
    let queue:NSOperationQueue = NSOperationQueue()

    NSURLConnection.sendAsynchronousRequest(request, queue:queue, completionHandler:{response, data, error in
        if data {
            var jerr:NSError?
            var json:NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error:&jerr) as NSDictionary

            if !jerr {
                println(json.description)
                let time:String = json.valueForKey("time") as String
                println(time)

                //  self.me.setDictionary(json)
            }
        }
    })
}

上面的代码可以正常工作,直到我想将 NSDictionary 中的值分配给变量。

let time:String = json.valueForKey("time") as String 

后面是 EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0) 但是

println(json.description) 

打印出一个有效的 NSDictionary。有人知道这个问题的解决方案吗?

【问题讨论】:

    标签: closures swift


    【解决方案1】:

    valueForKey() 方法返回一个可选值;您正在将该值强制为 String ,显然这导致了崩溃。我可以让 Swift REPL 崩溃:

      1> var json = ["a": "1", "b": "2"]
    json: Dictionary<String, String> = {
      [0] = {
        key = "a"
        value = "1"
      }
      [1] = {
        key = "b"
        value = "2"
      }
    }
      2> let data:String = json["b"] as String
    Bitcast requires both operands to be pointer or neither
      %58 = bitcast i8* %57 to %SS.232
    Bitcast requires both operands to be pointer or neither
      %110 = bitcast i8* %109 to %SS.232
    Stored value type does not match pointer operand type!
      store %SS.232 %110, i8** %.core7._baseAddress.value, align 8
     i8*LLVM ERROR: Broken function found, compilation aborted!
    Assertion failed: (err == 0), function ~Mutex, file /SourceCache/lldb_KLONDIKE/lldb_KLONDIKE-320.3.100/source/Host/common/Mutex.cpp, line 246.
    Abort trap: 6
    

    解决方案是放弃字符串强制。在我的例子中:

      2> let data:String? = json["b"]
    data: String? = "2"
    
      3> let data:String? = json["c"]
    data: String? = nil
    

    我怀疑您添加了 'as String' 1) 知道该值实际上是一个 String 和 2) 以避免编译器错误。正确的做法是使用? 表示可选值。

    【讨论】:

    • 与原代码不同的是,NSJSONSerialization.JSONObjectWithData返回的是AnyObject!我将其转换为 NSDictionary。我无法将其转换为 Dictionary。缺少用于处理 NSDictionary 的 swift 文档部分,并且 - 让数据:字符串? = json["time"] - 不编译。无法转换表达式的类型“AnyObject!”键入“StringLiteralConvertible”。见developer.apple.com/library/prerelease/ios/documentation/Swift/…
    【解决方案2】:

    在我意识到并非 NSDictionary 的所有值都是 NSString 之后,我解决了转换为原始 NSDictionary 值的正确类型的问题。如果你的服务返回一个像这样的混合类型 JSON 对象

    {"id":2, "name":"AC Vent Temp", ...}
    

    你必须像这样获取它的值。

    var id:int = sensor.valueForKey("id") as Int;
    var name:String? = sensor.valueForKey("name") as String;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 2014-09-17
      相关资源
      最近更新 更多