当前位置: 首页 > 面试题库 >

在Swift(2.0)中正确处理NSJSONSerialization(try catch)?

葛桐
2023-03-14
问题内容

arowmy初始化工作正常斯威夫特<2,但是在斯威夫特2我在Xcode得到一个错误信息Call can throw, but it is not marked with 'try' and the error is not handledlet anyObj = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! [String:AnyObject]。我认为我无法使用try
catch块,因为此时super尚未初始化。“尝试”需要一个抛出的函数。

这是我的功能:

required init(coder aDecoder : NSCoder)
{
    self.name  = String(stringInterpolationSegment: aDecoder.decodeObjectForKey("name") as! String!)
    self.number = Int(aDecoder.decodeIntegerForKey("number"))
    self.img = String(stringInterpolationSegment: aDecoder.decodeObjectForKey("image") as! String!)
    self.fieldproperties = []

    var tmpArray = [String]()
    tmpArray = aDecoder.decodeObjectForKey("properties") as! [String]


    let c : Int = tmpArray.count
    for var i = 0; i < c; i++
    {
        let data : NSData = tmpArray[i].dataUsingEncoding(NSUTF8StringEncoding)!

         // Xcode(7) give me error: 'CAll can thorw, but it is not marked with 'try' and the error is not handled'
        let anyObj =  NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! [String:AnyObject]

        let label = anyObj["label"] as AnyObject! as! String
        let value = anyObj["value"] as AnyObject! as! Int
        let uprate = anyObj["uprate"] as AnyObject! as! Int
        let sufix = anyObj["sufix"] as AnyObject! as! String

        let props = Fieldpropertie(label: label, value: value, uprate: uprate, sufix: sufix)
        self.fieldproperties.append(props)
    }
}

Xcode的意思是: let anyObj = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! [String:AnyObject]

但我不知道要按照此文档正确思考https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html


问题答案:

jsonObjectthrow的错误,所以把它内do块,使用trycatch出现的任何错误。在Swift 3中

do {
    let anyObj = try JSONSerialization.jsonObject(with: data) as! [String: Any]

    let label = anyObj["label"] as! String
    let value = anyObj["value"] as! Int
    let uprate = anyObj["uprate"] as! Int
    let sufix = anyObj["sufix"] as! String

    let props = Fieldpropertie(label: label, value: value, uprate: uprate, sufix: sufix)

    // etc.
} catch {
    print("json error: \(error.localizedDescription)")
}

或者,在Swift 4中,您可以通过struct遵循以下条件来简化代码Codable

struct Fieldpropertie: Codable {
    let label: String
    let value: Int
    let uprate: Int
    let suffix: String
}

然后

do {
    let props = try JSONDecoder().decode(Fieldpropertie.self, from: data)
    // use props here; no manual parsing the properties is needed
} catch {
    print("json error: \(error.localizedDescription)")
}


 类似资料:
  • 首先,我是iOS和Swift的新手,来自Android/Java编程的背景。因此,对我来说,在空间不足、文件权限问题或其他任何可能发生在文件上的情况下(根据我的经验,已经发生过),捕捉试图写入文件时的异常是第二天性。我也明白在Swift中,异常不同于Android/Java的异常,所以这不是我在这里要问的。 我试图使用NSFileHandle追加到一个文件中,如下所示: 但是,和函数都指示它们抛出

  • 问题内容: 我正在尝试获取JSON响应并将结果存储在变量中。在以前的Swift版本中,我已经使用过此代码的版本,直到Xcode 8的GM版本发布为止。我在StackOverflow上看到了一些类似的文章:Swift 2解析JSON- 无法 在Swift 3中下标’AnyObject’类型的值和JSON解析。 但是,似乎此处传达的想法不适用于这种情况。 如何在Swift 3中正确解析JSON响应?在

  • 问题内容: 我希望我的计时器一次执行一次actionPerformed方法(5秒一次),但是它多次在控制台“ Hello”中写入: 如何产生想要的效果?谢谢 问题答案: 如前所述,最好使用,但也可以在开始之前使用setRepeats():

  • 假设我有一个类Person,具有不同数据类型的不同属性,我在我的主方法中有这样的代码: 现在,假设高度的赋值引发了一个异常,例如InvalidCastException,代码将停止执行,并且可能会记录一些东西,以防我有一个记录表。问题是,从日志中,我无法确切地理解哪一行和赋值抛出了异常。 是否有任何方法可以捕获异常,并能够记录(数据库中的某个位置)哪个赋值引发异常,以及在这种情况下针对哪种类型的强

  • 问题内容: 我意识到这里已经有很多类似的问题,但是我无法弄清楚。 我有一个Web服务(C#,. net 3.5)。您需要了解的基本代码如下: 另外,在web.config中,我做了以下添加(我刚刚在其他帖子上看到了……这是正常/安全吗?) 然后在Default.aspx中,我有两个主要参考… 从Google代码下载了jquery.json-2.2.min.js 这是Javascript: 当我执行

  • 我有以下项目结构: 这最初是一个Eclipse项目,我需要在IntelliJ中导入它。 然而,每次我试图导入它时,IntelliJ都与源根文件夹完全混淆了。 查看java源文件,我在包声明中得到以下错误: 错误:包名称“com.company”与文件路径“src/com.company”不对应 和 错误:包名“com.company”与文件路径“test-src/com.company”不对应 我