我如何重写此函数,使其使用 SwiftyJSON 而不是 JSON.swift?
How can I rewrite this function so that it uses SwiftyJSON instead of JSON.swift?
我正在看 Ray Wenderlich 教程 http://www.raywenderlich.com/90971/introduction-mapkit-swift-tutorial,他正在使用这个功能:
class func fromJSON(json: [JSONValue]) -> Artwork? {
// 1
var title: String
if let titleOrNil = json[16].string {
title = titleOrNil
} else {
title = ""
}
let locationName = json[12].string
let discipline = json[15].string
// 2
let latitude = (json[18].string! as NSString).doubleValue
let longitude = (json[19].string! as NSString).doubleValue
let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
// 3
return Artwork(title: title, locationName: locationName!, discipline: discipline!, coordinate: coordinate)
}
因为我在我的项目中使用了 SwiftyJSON,所以我想继续使用它,所以我考虑基于它重写这个函数。
如果我没理解错的话,这个函数需要一个 json 节点并从中创建 Artwork
对象。
那么如何使用 SwiftyJSON 引用单个 json 节点?
我试过:
class func fromJSON(JSON_: (data: dataFromNetworking))->Artwork?{
}
但它会导致错误 use of undeclared type dataFromNetworking
。另一方面,这正是他们在文档中使用它的方式 https://github.com/SwiftyJSON/SwiftyJSON
你能帮我重写一下吗?
要在此项目中使用 SwiftyJSON
,首先您必须更改从 属性 列表文件检索数据的方法。
注意:此替换适用于 Swift 2.
将ViewController
中的方法loadInitialData()
替换为
func loadInitialData() {
do {
let fileName = NSBundle.mainBundle().pathForResource("PublicArt", ofType: "json")
let data = try NSData(contentsOfFile: fileName!, options: NSDataReadingOptions())
let jsonObject = JSON(data:data)
if let jsonData = jsonObject["data"].array {
for artworkJSON in jsonData {
if let artworkJSONArray = artworkJSON.array, artwork = Artwork.fromJSON(artworkJSONArray) {
artworks.append(artwork)
}
}
}
} catch let error as NSError {
print(error)
}
}
然后在方法
中交换[JSONValue]
class func fromJSON(json: [JSONValue]) -> Artwork? {
Artwork
class 的 和 [JSON]
,所以现在是
class func fromJSON(json: [JSON]) -> Artwork? {
就是这样。
我的建议:将 model layer
与 presentation layer
分开。
艺术品模型
首先,您需要一种表示数据的方法。结构非常适合这个。
struct ArtworkModel {
let title: String
let locationName: String
let discipline: String
let coordinate: CLLocationCoordinate2D
init?(json:JSON) {
guard let
locationName = json[12].string,
discipline = json[15].string,
latitudeString = json[18].string,
latitude = Double(latitudeString),
longitueString = json[19].string,
longitude = Double(longitueString) else { return nil }
self.title = json[16].string ?? ""
self.locationName = locationName
self.discipline = discipline
self.coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
}
}
如您所见,ArtworkModel 能够从 json.
初始化自身
表示层
现在 Artwork
(符合 MKAnnotation
)变得容易多了。
class Artwork: NSObject, MKAnnotation {
private let artworkModel: ArtworkModel
init(artworkModel: ArtworkModel) {
self.artworkModel = artworkModel
super.init()
}
var title: String? { return artworkModel.title }
var subtitle: String? { return artworkModel.locationName }
var coordinate: CLLocationCoordinate2D { return artworkModel.coordinate }
}
用法
你的功能现在变成了
class func fromJSON(json: JSON) -> Artwork? {
guard let model = ArtworkModel(json: json) else { return nil }
return Artwork(artworkModel: model)
}
我正在看 Ray Wenderlich 教程 http://www.raywenderlich.com/90971/introduction-mapkit-swift-tutorial,他正在使用这个功能:
class func fromJSON(json: [JSONValue]) -> Artwork? {
// 1
var title: String
if let titleOrNil = json[16].string {
title = titleOrNil
} else {
title = ""
}
let locationName = json[12].string
let discipline = json[15].string
// 2
let latitude = (json[18].string! as NSString).doubleValue
let longitude = (json[19].string! as NSString).doubleValue
let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
// 3
return Artwork(title: title, locationName: locationName!, discipline: discipline!, coordinate: coordinate)
}
因为我在我的项目中使用了 SwiftyJSON,所以我想继续使用它,所以我考虑基于它重写这个函数。
如果我没理解错的话,这个函数需要一个 json 节点并从中创建 Artwork
对象。
那么如何使用 SwiftyJSON 引用单个 json 节点?
我试过:
class func fromJSON(JSON_: (data: dataFromNetworking))->Artwork?{
}
但它会导致错误 use of undeclared type dataFromNetworking
。另一方面,这正是他们在文档中使用它的方式 https://github.com/SwiftyJSON/SwiftyJSON
你能帮我重写一下吗?
要在此项目中使用 SwiftyJSON
,首先您必须更改从 属性 列表文件检索数据的方法。
注意:此替换适用于 Swift 2.
将ViewController
中的方法loadInitialData()
替换为
func loadInitialData() {
do {
let fileName = NSBundle.mainBundle().pathForResource("PublicArt", ofType: "json")
let data = try NSData(contentsOfFile: fileName!, options: NSDataReadingOptions())
let jsonObject = JSON(data:data)
if let jsonData = jsonObject["data"].array {
for artworkJSON in jsonData {
if let artworkJSONArray = artworkJSON.array, artwork = Artwork.fromJSON(artworkJSONArray) {
artworks.append(artwork)
}
}
}
} catch let error as NSError {
print(error)
}
}
然后在方法
中交换[JSONValue]
class func fromJSON(json: [JSONValue]) -> Artwork? {
Artwork
class 的 和 [JSON]
,所以现在是
class func fromJSON(json: [JSON]) -> Artwork? {
就是这样。
我的建议:将 model layer
与 presentation layer
分开。
艺术品模型
首先,您需要一种表示数据的方法。结构非常适合这个。
struct ArtworkModel {
let title: String
let locationName: String
let discipline: String
let coordinate: CLLocationCoordinate2D
init?(json:JSON) {
guard let
locationName = json[12].string,
discipline = json[15].string,
latitudeString = json[18].string,
latitude = Double(latitudeString),
longitueString = json[19].string,
longitude = Double(longitueString) else { return nil }
self.title = json[16].string ?? ""
self.locationName = locationName
self.discipline = discipline
self.coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
}
}
如您所见,ArtworkModel 能够从 json.
初始化自身表示层
现在 Artwork
(符合 MKAnnotation
)变得容易多了。
class Artwork: NSObject, MKAnnotation {
private let artworkModel: ArtworkModel
init(artworkModel: ArtworkModel) {
self.artworkModel = artworkModel
super.init()
}
var title: String? { return artworkModel.title }
var subtitle: String? { return artworkModel.locationName }
var coordinate: CLLocationCoordinate2D { return artworkModel.coordinate }
}
用法
你的功能现在变成了
class func fromJSON(json: JSON) -> Artwork? {
guard let model = ArtworkModel(json: json) else { return nil }
return Artwork(artworkModel: model)
}