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)
}
}
}
但是我有错误
我做错了什么?
两件事情看起来不对。
- 你应该 returning
Article?
因为你有可能 returning nil。
- 您在
id = Int(json["id...
之类的内容之后有许多无关的逗号。摆脱他们。
- 关闭似乎是不必要的。只需首先检查有效的 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?" 可以让它再次成为可选的。
我有一个 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)
}
}
}
但是我有错误
我做错了什么?
两件事情看起来不对。
- 你应该 returning
Article?
因为你有可能 returning nil。 - 您在
id = Int(json["id...
之类的内容之后有许多无关的逗号。摆脱他们。 - 关闭似乎是不必要的。只需首先检查有效的 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?" 可以让它再次成为可选的。