Swift:运行时的通用类​​型推断

时间:2017-02-17 17:52:05

标签: swift generics

看到奇怪的一般行为,这让我相信我在理解中遗漏了一些东西。

我使用以下方法循环抛出JSON响应并调用泛型方法。 UserCardEcard都继承自IDObjectObject继承自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>

1 个答案:

答案 0 :(得分:1)

泛型在编译时进行评估,并分配一个具体的类型。没有“运行时类型推断”这样的东西。

我认为您想要的主要变化是:

func delete(_ type:IDObject.Type, ids:[Int]) {

您不想在type上专门化此功能,只想传递type

不清楚objects(_:where:)返回什么,因此这可能会破坏您的delete方法。您可能需要使其不那么具体:

func delete(_ objects:Results<Object>) {

(这不是用于子类型的灵丹妙药;我假设objects(_:where:)完全返回Results<Object>。)