如何重写此函数以便它使用SwiftyJSON而不是JSON.swift?

时间:2016-02-21 23:13:39

标签: ios swift swifty-json

我正在查看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

中使用它的确切方式

你可以帮我改写一下吗?

2 个答案:

答案 0 :(得分:5)

我的建议:将_BitsTypemodel layer分开。

ArtworkModel

首先,您需要一种表示数据的方法。结构是完美的。

presentation layer

正如您所见,ArtworkModel能够从json初始化自己。

表示层

现在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) } } (符合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 }
}

答案 1 :(得分:1)

要在此项目中使用SwiftyJSON,首先必须更改方法以从属性列表文件中检索数据。

注意:此替代版适用于Swift 2。

loadInitialData()中的方法ViewController替换为

  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[JSON]

,所以它现在是

class func fromJSON(json: [JSON]) -> Artwork? {

就是这样。