이상한 일반적인 행동을 보면 내 이해에서 뭔가 빠져 있다는 것을 알게됩니다.스위프트 (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
(A 영역 클래스)에서 상속하는 IDObject
에서 상속합니다.
그러나 for prop in props
루프의 래핑을 해제하면 예상대로 작동합니다.
if let userIds = json["deletedUsers"].arrayObject as? [Int], userIds.count > 0 {
DataManager.shared.delete(User.self, ids: userIds)
}
제네릭은 컴파일시에만 작동하며, 런타임시 동적으로 처리 할 수있는 방법이 있습니까?
정확히 당신이 "무엇을 의미합니까 *은' delete 함수는 generic 형식을 이런 식으로 유추 할 수 없습니다 * "? 컴파일러 오류가 발생합니까? (만약 그렇다면 어디에서?)'DataManager.shared.delete (prop.type, ids : ids')에서 닫는 괄호를 놓치고 있습니다. 하나의 매개 변수로'delete'를 오버로드하지 않으면, 당신은 그것을 호출 할 수 없습니다. 단일 매개 변수 ('delete (objectsToDelete)'). 예상되는 동작과 실제 동작을 포함하여 [mcve]를 제공 할 수 있습니까? – Hamish
@Hamish 전체 코드베이스가 매우 커서 공유 할 자유가 없습니다. 여기에 많은 부분을 수정했고 누락 된 닫는 괄호를 수정했습니다. delete는 실제로 오버로드되었습니다. delete (:) 메소드는'결과
전체 코드베이스를 공유 할 필요는 없으며 같은 문제를 재현하는 최소한의 독립적 인 예제 만이 존재한다. DataManager.shared.delete'는'delete (_ : ids :)'를 참조해야합니까?'objects (_ : where :)'는 무엇을 반환합니까? 심지어 같은 문제를 재현하는 함수를 모의해라.) 'ids'는 문제와 관련이 있습니까? (그렇지 않으면 제거하십시오). – Hamish