如何在具有泛型类型的类中的Realm对象上使用自定义初始值设定项?

时间:2017-06-27 21:27:00

标签: ios swift generics realm

我有一个名为ObjectManager的类,其类型为O: Object, Persistable。这样我就可以拥有一个可以使用领域Object的多个不同子类操作的类。但问题出在最后一行cache = O(message: "hello world"),错误是:调用中的参数标签不正确(有'消息:',预期'值:')

在输入时,它建议我可以使用Persistable协议的初始化程序,但在编译期间抱怨,它期望来自Object类的初始化程序。是否可以使用Persistable初始化程序?

protocol Persistable {
  init(message: String)
}

class CustomObject: Object, Persistable {
  dynamic var message: String = ""
  required convenience init(message: String) {
    self.init()
    self.message = message
  }
}

class ObjectManager<O>: NSObject where O: Object, O: Persistable {
  var cache: O?

  func didReceive(message: String) {
    cache = O(message: "hello world")
  }
}

1 个答案:

答案 0 :(得分:4)

如果您使CustomObject课程成为最终版本,并使用工厂方法替换初始化程序,您将获得符合您需要的代码。不幸的是,在这种情况下,Swift编译器错误消息是如此神秘,以至于完全无益。

protocol Persistable {
    static func factory(message: String) -> Self
}

final class CustomObject: Object, Persistable {
    dynamic var message: String = ""
    static func factory(message: String) -> CustomObject {
        let x = CustomObject()
        x.message = message
        return x
    }
}

class ObjectManager<O>: NSObject where O: Object, O: Persistable {
    var cache: O?

    func didReceive(message: String) {
        cache = O.factory(message: "hello world")
    }
}