CocoaPods trunk is moving to be read-only. Read more on the blog, there are 18 months to go.

ReflectedStringConvertible 1.2.0

ReflectedStringConvertible 1.2.0

TestsTested
LangLanguage SwiftSwift
License MIT
ReleasedLast Release Dec 2017
SwiftSwift Version 4.0
SPMSupports SPM

Maintained by Matt Comi.



  • By
  • Matt Comi

ReflectedStringConvertible

A protocol that extends CustomStringConvertible and uses reflection to add a detailed textual representation to any class. Two styles are supported:

  1. normal: Similar to Swift’s default textual representation of structs.
  2. json: Pretty JSON representation.

Usage

Simply import ReflectedStringConvertible and conform to the ReflectedStringConvertible protocol:

import ReflectedStringConvertible

class YourClass: ReflectedStringConvertible {
  // that's all.
}

For example:

class Person: ReflectedStringConvertible {
  var name: String
  var age: Int

  init(name: String, age: Int) {
    self.name = name
    self.age = age
  }
}

print(Person(name: "Matt", age: 33)) outputs:

Person(name: "Matt", age: 33)

A style may be specified with reflectedDescription(style:). The default style is normal. That is, calling description is the same as calling reflectedDescription(.normal).

For example, print(Person(name: "Matt", age: 33).reflectedDescription(.json)) outputs:

{
  "age" : 33,
  "name" : "Matt"
}

Refer to the API Documentation for further information.

Features

ReflectedStringConvertible stored properties

ReflectedStringConvertible objects with ReflectedStringConvertible stored properties are handled correctly:

class Movie: ReflectedStringConvertible {
  var title: String
  var year: Int

  // another ReflectedStringConvertible
  var director: Person

  init(title: String, year: Int, director: Person) {
    self.title = title
    self.year = year
    self.director = director
  }
}

let george = Person(name: "George Miller", age: 71)
let movie = Movie(title: "Mad Max", year: 2015, director: george)

print(movie.reflectedDescription(.normal)) (or just print(movie)) outputs:

Movie(title: "Mad Max", year: 2015, director: Person(name: "George Miller", age: 71))

And print(movie.reflectedDescription(.json)) outputs:

{
  "title" : "Mad Max",
  "year" : 2015,
  "director" : {
    "age" : 71,
    "name" : "George Miller"
  }
}

Collections

ReflectedStringConvertible objects within Array, Dictionary and Set collections are handled correctly:

class Series: ReflectedStringConvertible {
  var title: String
  var cast: [Person]

  init(title: String, cast: [Person]) {
    self.cast = cast
  }
}

var cast = [Person]()

cast.append(Person(name: "Justin Theroux", age: 44))
cast.append(Person(name: "Carrie Coon", age: 35))

let series = Series(title: "The Leftovers", cast: cast)

print(series) outputs:

TVShow(title: "The Leftovers", cast: [Person(name: "Justin Theroux", age: 44), Person(name: "Carrie Coon", age: 35)])

print(series.reflectedDescription(.json)) outputs:

{
  "title" : "The Leftovers",
  "cast" : [
    {
      "age" : 44,
      "name" : "Justin Theroux"
    },
    {
      "age" : 35,
      "name" : "Carrie Coon"
    }
  ]
}

Credits

Developed by Matt Comi (@mattcomi)