SwiftyJSON 错误

SwiftyJSON error

我有一个 class 和一个构建方法,我想用它来创建 class 的实例。

代码如下

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)
    }
}

}

但是我有错误

我做错了什么?

两件事情看起来不对。

  1. 你应该 returning Article? 因为你有可能 returning nil。
  2. 您在 id = Int(json["id... 之类的内容之后有许多无关的逗号。摆脱他们。
  3. 关闭似乎是不必要的。只需首先检查有效的 JSON,如果它是错误的 return 零,否则建立它并 return 文章。

您有 ,s 不应该出现的地方。试试这个:

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)
    }
}

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
    }
}

另外,您似乎 copied/pasted Article 初始值设定项中的参数在函数中较早地声明了它们,但您忘记去掉行尾的逗号。

更新

你的问题是你的 class 属性是不可变的(用 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

如果编译器抱怨 "not marked with try",请使用 "try?":

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

说明:SwiftyJSON 可能在没有更新文档的情况下更改了这个方法(或者我没有找到它)。它以前返回一个 Optional,现在似乎是 "throw"。使用 "try?" 可以让它再次成为可选的。