SwiftyJSON错误

时间:2015-10-13 13:55:04

标签: ios swift swifty-json

我有一个带有init的类,我想用它来创建类的实例。

代码如下

class Article {

let id:Int
let title:String
let subtitle:String
let editor1:String
let mainImage:NSData

init(id:Int, title:String, subtitle:String, editor1:String, mainImage:NSData) {
    self.id = id
    self.title = title
    self.subtitle = subtitle
    self.editor1 = editor1
    self.mainImage = mainImage
}

class func build(json:JSON) -> Article {
        id = Int(json["id"].string),
        title = json["title"].string,
        subtitle = json["subtitle"].string,
        editor1 = json["editor1"].string,
        mainImage = json["images"]["main"].rawData() {
            return Article(
                id: id,
                title: title,
                subtitle: subtitle,
                editor1: editor1,
                mainImage: mainImage)
    }
}

}

但我有错误

enter image description here

我做错了什么?

3 个答案:

答案 0 :(得分:1)

一些事情看起来很不错。

  1. 您应该返回Article?,因为您有可能会返回零。
  2. 在诸如id = Int(json["id...之类的事情之后,你有很多无关的逗号。摆脱它们。
  3. 这种关闭似乎是不必要的。只需检查有效的JSON,如果它的错误返回为零,否则建立它并返回文章。

答案 1 :(得分:1)

SwiftyJSON的.rawData()是一个可选的getter。

所以我想你想要做的是使用if let

class func build(json:JSON) -> Article? {
    id = Int(json["id"].string)
    title = json["title"].string
    subtitle = json["subtitle"].string
    editor1 = json["editor1"].string
    if let mainImage = json["images"]["main"].rawData() {
        return Article(
            id: id,
            title: title,
            subtitle: subtitle,
            editor1: editor1,
            mainImage: mainImage)
    } else {
        // ...
        return nil
    }
}

此外,您似乎复制/粘贴了文章初始值设定项中的参数,以便在函数的前面声明它们,但是您忘记删除行尾的逗号。

<强>更新

你的问题是你的类属性是不可变的(用let声明)但在这个函数中你试图改变它们的值:

id = Int(json["id"].string)

这被解释为

self.id = Int(json["id"].string)

并且您无法更改self.id的值,因为它是不可变的。

解决方案:

1-使用var代替let使属性可变。例如:

var id:Int
var title:String
var subtitle:String
var editor1:String
var mainImage:NSData

2-不要替换函数中的属性,因为无论如何你要使用新对象初始化。例如:

class func build(json:JSON) -> Article? {
    if let img = json["images"]["main"].rawData() {
        return Article(
            id: Int(json["id"].string),
            title: json["title"].string,
            subtitle: json["subtitle"].string,
            editor1: json["editor1"].string,
            mainImage: img)
    } else {
        // ...
        return nil
    }
}

更新2

如果编译器抱怨“没有标记为尝试”,请使用“try?”执行“if let”:

if let img = try? json["images"]["main"].rawData() {

说明:SwiftyJSON可能在没有更新文档的情况下更改了此方法(或者我没有找到它)。它先前返回了一个Optional,现在似乎是“抛出”了。用“试试?”让你再次选择它。

答案 2 :(得分:0)

你有,他们应该不在的地方。试试这个:

class func build(json:JSON) -> Article {
    id = Int(json["id"].string)
    title = json["title"].string
    subtitle = json["subtitle"].string
    editor1 = json["editor1"].string
    mainImage = json["images"]["main"].rawData() {
        return Article(
            id: id,
            title: title,
            subtitle: subtitle,
            editor1: editor1,
            mainImage: mainImage)
    }
}