Невозможно добавить класс с универсальным типом для быстрой области - PullRequest
0 голосов
/ 26 февраля 2019

Мне нужно сохранить класс в области, этот класс содержит общий тип следующим образом: -

@objcMembers
class ClassA<T: Object & Codable>: Object, Codable {
    dynamic var key: String?
    dynamic var type: T?

    override class func primaryKey() -> String {
        return "key"
    }

}

@objcMembers
class ClassB: Object, Codable {    
}

let object: ClassA<ClassB> 

realm.add(object, update: true)

Но этот код, к сожалению, сохраняет только ClassA.key в области и игнорирует ClassA.type.

Я гуглил по этому поводу, но, к сожалению, безрезультатно.Кажется, что никто не использует универсальный тип внутри класса области.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Наконец-то я нашел правильное решение.Я использовал преимущество типа списка универсальных областей, затем я изменил переменную «тип», чтобы она представляла собой список универсальных вместо одного универсального объекта.Сейчас у меня нормально работает.Теперь я могу легко использовать универсальный тип внутри класса и без проблем сохранить этот класс в области.

@objcMembers
class ClassA<T: Object & Codable>: Object, Codable {
    dynamic var key: String?
    var type: List<T>()

    override class func primaryKey() -> String {
        return "key"
    }

}

@objcMembers
class ClassB: Object, Codable {    
}

let object: ClassA<ClassB>

realm.add(object, update: true)
0 голосов
/ 26 февраля 2019

@objcMembers только выставляет совместимых членов в Objective-C.Обобщения Swift не включаются в это, поскольку они не совместимы с Objective-C.Царство работает от воздействия на членов Objective-C.

Возможное решение:

@objcMembers
class ClassA<T: Object & Codable>: Object, Codable {
    dynamic var key: String?
    var type: T?

    override class func primaryKey() -> String {
        return "key"
    }

}

@objcMembers
class ClassB: Object, Codable {

}

class ClassABComposite: ClassA<ClassB> {
    // T can be realized as ClassB here
    override var type: ClassB? {
        set {
            backingType = newValue
        }
        get {
            return backingType
        }
    }

    // This will work because it's not generic
    @objc dynamic var backingType: ClassB?
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...