【问题标题】:IOS Swift Unwrapping NSData is CrashingIOS Swift Unwrapping NSData 崩溃了
【发布时间】:2015-10-25 07:55:27
【问题描述】:

打开包装时出现 IOS swift 问题,崩溃。当我以字符串或

打印时,我以NSData 获取数据
var dict : AnyObject = NSJSONSerialization.JSONObjectWithData(returnData!, options: NSJSONReadingOptions(0), error: &respError) as AnyObject!

这样做是返回字典nil, 或

var datastring : NSString = NSString(data:returnData!, encoding:NSUTF8StringEncoding)[This is My Image Liknk] as! String

导致致命错误的数据字符串:

在展开 Optional 值时意外发现 nil。

【问题讨论】:

    标签: ios xcode swift


    【解决方案1】:

    这是因为returnData! 是零。如果你在var dict 设置一个断点,运行然后po returnData! 我相信你会发现这是真的。并且因为 NSJSONSerialization 试图作为参数接受的数据是 nil,所以它也将是 nil。我会通过你的逻辑或你的来源来弄清楚为什么它是 nil。

    此外,如果您使用 NSURLSession 来检索数据 - 请确保在调用 dataTaskWithURL 之前配置了有效的会话。就这样……

    var config = NSURLSessionConfiguration.defaultSessionConfiguration()
    var session = NSURLSession(configuration: config)
    var dataTask:NSURLSessionDataTask = session.dataTaskWithURL...
    

    我遇到了这个问题,发现在调用数据任务之前需要配置会话。

    编辑也试试这个。使用可选绑定。

    if let data: NSDictionary = NSJSONSerialization.JSONObjectWithData(returnData, options: NSJSONReadingOptions.AllowFragments, error: nil) as? NSDictionary {
    
                println("json = \(data)")
            }
    
            else { 
    
                println("returnData really is nil")
            }
    

    【讨论】:

    • 对不起,返回数据!这有数据
    • 嘿,我更新了我的答案,试试看,告诉我你得到了什么。
    【解决方案2】:

    您最好先检查所有值,然后再假设它们不为零。用“!”你告诉你的代码这个值可以被安全地解包,即使它可能仍然是 nil。因此,当它为零时,它会崩溃。我通常做的是:

    // Unwrap the string, check if it ain't nil and store this in a new value.
    if let content: String = item.content as? String {
        if content != "" {
            var error: NSError?
            // Unwrap the data optional from dataUsingEncoding and also check if it ain't nil. Store this in a new value.
            if let data: NSData = content.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true),
                // Unwrap the optional returned from JSONObjectWithData and also check if it ain't nil. Store the value in a new object.
                let json: NSMutableDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as? NSMutableDictionary {
                // Do stuff with the dictionary.
            } else {
                if let err: NSError = error {
                    println(err.localizedDescription)
                }
            }
        }
    }
    

    通过所有这些检查,我确信我的代码不会在 swift 中将字符串反序列化为 json 崩溃。

    看来我的回答有点慢,但 Nilesh Patel 有一个很好的引述,你应该看看。

    【讨论】:

      【解决方案3】:

      您正在强制解包值(强制解包),如果该对象包含 nil,那么它将产生运行时错误。

      尝试使用!访问不存在的可选值会触发 运行时错误。始终确保可选项包含非零 使用前的价值!强制解包它的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-02
        • 2015-11-23
        • 2016-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多