title: Should I use optional for properties of object models that will be parsed from JSON?
body: <p>My iOS app has a pretty common setup: it makes HTTP queries to an API server that responds with JSON objects. These JSON objects are then parsed to appropriate Swift objects.</p>
  
  <p>Initially I divided properties into required properties and optional properties, mostly based on my API server's database requirements. For example, <code>id</code>, <code>email</code>, and <code>name</code> are require fields so they use non-optional types. Others can be <code>NULL</code> in database, so they are optional types.</p>
  
  <pre><code>class User {
    let id: Int
    let email: String
    let profile: String?
    let name: String
    let motive: String?
    let address: String?
    let profilePhotoUrl: String?
  }
  </code></pre>
  
  <p>Recently, I started wondering whether this was a good setup at all. I found out that although some properties might be always in the database, that does not mean that those properties will always be included in the JSON response. </p>
  
  <p>For example, in the User profile page, all these fields are needed to properly display the view. Therefore, JSON response will include all these fields. For a view that lists users' names, however, I would not need <code>email</code> or <code>id</code>, and JSON response should probably not include those properties either. Unfortunately, this will cause error and crash the app when parsing JSON response into Swift object since the app expects <code>id</code>, <code>email</code>, <code>name</code> to be always not-nil.</p>
  
  <p>I'm thinking of changing all properties of Swift objects into optionals, but it feels like throwing away all the benefits of this language-specific feature. Moreover, I will have to write many more lines of code to unwrap all these optionals somewhere else in the app anyway.</p>
  
  <p>On the other hand, JSON objects are by their nature not very interoperable with strict static typing and nil-checking of Swift so it might be better to simply accept that annoyance. </p>
  
  <p>Should I transition to models with every property as optionals? Or is there a better way? I'd appreciate any comment here. </p>