奇妙な一般的な振る舞いを見て、私が私の理解の中で何かを見逃していると信じさせる。Swift:実行時の一般的な型推論
次のメソッドを使用して、JSON応答をループしてジェネリックメソッドを呼び出します。 User
、Card
とEcard
すべてが順番に
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])
機能は、ジェネリック型をこのように推測することはできませんObject
(レルムクラス)から継承され、IDObject
から継承します。
ただし、for prop in props
ループをアンラッピングすると、正常に動作します。
if let userIds = json["deletedUsers"].arrayObject as? [Int], userIds.count > 0 {
DataManager.shared.delete(User.self, ids: userIds)
}
ジェネリックはコンパイル時にのみ動作しますか、実行時にこれを動的に処理する方法はありますか?
あなたが*」によって、正確に何を意味します ' delete関数はこのようにジェネリック型を推論することはできません* "?コンパイラエラーが発生しますか? (もしそうなら、どこですか?) 'DataManager.shared.delete(prop.type、ids:ids')の閉じ括弧がありません。一つのパラメータで' delete'をオーバーロードしない限り、あなたはそれを呼び出すことができません – Hamish
@Hamishコードベース全体が非常に大きく、私はそれを共有する自由がありません。(例えば、 "delete(objectsToDelete)") delete(:)メソッドは 'Results
コードベース全体を共有する必要はありません - 同じ問題を再現する最小限の自己完結型の例のみです。 DataManager.shared.delete'は 'delete(_:ids:)'を参照することになっていますか? 'objects(_:where:)'は何を返しますか(あなたは関数を表示しなくても、同じ問題を再現する関数を模擬してください)。 'ids'は問題と関連していますか? (そうでない場合は、取り外してください)。 – Hamish