Подтвердить что ты не робот

Как я могу переписать эту функцию так, чтобы она использовала SwiftyJSON вместо 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 node и создает из него объект Artwork.

Итак, как я могу ссылаться на один json node с SwiftyJSON?

Я пробовал делать:

class func fromJSON(JSON_: (data: dataFromNetworking))->Artwork?{

}

но вызывает ошибку use of undeclared type dataFromNetworking. С другой стороны, именно то, как они используют его в документации https://github.com/SwiftyJSON/SwiftyJSON

Не могли бы вы помочь мне переписать его?

4b9b3361

Ответ 1

Мое предложение: отделите model layer от presentation layer.

ArtworkModel

Прежде всего вам нужен способ представления данных. Для этого идеально подходит структура.

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

Ответ 2

Чтобы использовать 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? {

Что это.