看到奇怪的泛型行爲,這導致我相信我錯過了我理解中的某些東西。Swift:運行時泛型類型推斷
我正在使用以下方法循環拋出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)
}
不要只泛型在編譯的時候工作,或者是有沒有辦法在運行時動態處理呢?
究竟你「的意思*了'刪除'函數不能通過這種方式推斷泛型*「?你得到一個編譯器錯誤? (如果是的話,在哪裏?)你錯過了'DataManager.shared.delete(prop.type,ids:ids')的右括號,除非你用單個參數重載'delete',否則不能調用它一個參數('delete(objectsToDelete)')。請你提供一個[mcve],包括預期的行爲和實際行爲? – Hamish
@Hamish整個代碼庫非常大,我不能隨意分享它我已經在這裏大量地編輯了它,並且我已經修復了缺失的右括號,'delete'確實被重載了 - 'delete(:)'方法需要一個'Results
你不需要共享整個代碼庫 - 只有一個最小的自包含的例子,重現相同的問題。是' DataManager.shared.delete'應該引用'delete(_:ids:)'?什麼是對象(_:where:)'return?(你沒有甚至必須顯示功能,只是模擬一個功能,重現相同的問題)。 「ids」甚至與問題有關嗎? (如果沒有,請將其刪除)。 – Hamish