Swift: creating a model class from JSON with a failover initializer

I am trying to implement some classes that can be initialized with JSON data [String : AnyObject]. Failed initializers seem ideal for this use case, but I can't get the syntax to work correctly (without creating ugly code).

Is it possible to do something like this?

class Person {
  let firstName: String
  let middleName: String?

  init?(JSONData data: [String : AnyObject]) {
    do {
      try {
        self.firstName = data["firstName"] as! String
        self.middleName = data["middleName"] as? String
      }
    } catch {
      return nil
    }
  }
}
+4
source share
1 answer

Here's how I usually define types of models with a failover initializer.

struct Person {
    let firstName: String
    let middleName: String?

    init?(JSONData data:[String:AnyObject]) {
        guard let firstName = data["firstName"] as? String else { return nil }
        self.firstName = firstName
        self.middleName = data["middleName"] as? String
    }
}

Why Struct?

As you can see, I use Struct instead of a class, there are at least two big reasons for this:

  • failable initializers structs, nil
  • ( )

let?

guard let, , - , .

middleName. , middleName . , middleName , Person,

struct Person {
    let firstName: String
    let middleName: String

    init?(JSONData data:[String:AnyObject]) {
        guard let
            firstName = data["firstName"] as? String,
            middleName = data["middleName"] as? String else { return nil }
        self.firstName = firstName
        self.middleName = middleName
    }
}

, - ! 😱

!

[...] Swift , . Swift , , .

+5

Source: https://habr.com/ru/post/1619263/


All Articles