Issue #4

Realm is great. But without primary key, it will duplicate the record, like,, … So to force ourselves into the good habit of declaring primary key, we can leverage Swift protocol

Create primary constrain protocol like this

protocol PrimaryKeyAware {
  var id: Int { get }
  static func primaryKey() -> String?

and conform it in out Realm object

class Profile: Object, PrimaryKeyAware {

  dynamic var firstName: String = ""
  dynamic var lastName: String = ""
  dynamic var id: Int = 0

  override static func primaryKey() -> String? {
    return "id"

This way, when using that object in out RealmStorage, we are safe to say that it has a primary key

class RealmStorage<T: Object> where T: PrimaryKeyAware {
  let realm: Realm

  init(realm: Realm = RealmProvider.realm()) {
    self.realm = realm

  func save(_ objects: [T]) {
    try? realm.write {
      realm.add(objects, update: true)

The usage is like this

let profile = Profile()
let storage = RealmStorage<Profile>()[profile])