看到奇怪的一般行为,这让我相信我在理解中遗漏了一些东西。
我使用以下方法循环抛出JSON响应并调用泛型方法。 User
,Card
和Ecard
都继承自IDObject
,Object
继承自let props:[(label:String, type:IDObject.Type)] = [
(label: "deletedUsers", type: User.self),
(label: "deletedCards", type: Card.self),
(label: "deletedECards", type: Ecard.self)
]
for prop in props {
if let ids = json[prop.label].arrayObject as? [Int], ids.count > 0 {
DataManager.shared.delete(prop.type, ids: ids)
}
}
func delete<T:IDObject>(_ type:T.Type, ids:[Int]) {
guard ids.count > 0 else { return }
if let objectsToDelete = objects(type, where: NSPredicate(format: "identifier IN %@", ids)) {
delete(objectsToDelete)
}
}
func delete<T:Object>(_ objects:Results<T>) {
guard objects.count > 0 else { return }
do {
let realm = try Realm()
try realm.write {
realm.delete(objects)
}
} catch {
print(error)
}
}
(领域类)
delete(_ type:T.Type, ids:[Int])
for prop in props
函数不能以这种方式推断泛型类型。
但是,展开if let userIds = json["deletedUsers"].arrayObject as? [Int], userIds.count > 0 {
DataManager.shared.delete(User.self, ids: userIds)
}
循环可以正常工作。
pip install --user scipy
泛型只能在编译时工作,还是有办法在运行时动态处理它?</ p>
答案 0 :(得分:1)
泛型在编译时进行评估,并分配一个具体的类型。没有“运行时类型推断”这样的东西。
我认为您想要的主要变化是:
func delete(_ type:IDObject.Type, ids:[Int]) {
您不想在type
上专门化此功能,只想传递type
。
不清楚objects(_:where:)
返回什么,因此这可能会破坏您的delete
方法。您可能需要使其不那么具体:
func delete(_ objects:Results<Object>) {
(这不是用于子类型的灵丹妙药;我假设objects(_:where:)
完全返回Results<Object>
。)