所以我反对这个问题。
我有一个BaseModel,里面有一些变量,还有一些从BaseModel继承的普通“final”模型。
如果我有一个带有BaseModel类的数组,里面有几个最终模型,然后循环通过这些模型并将它们发送到使用泛型的函数。并检查我得到的泛型类,它们来自BaseModel类,而不是我需要的最终类模型。如何以动态方式检索最终模型的类。当然我可以投他们,但我很想找到更好的解决方案。
参见我做的游乐场的例子:
import UIKit
class BaseModel {
var id: Int
init(id: Int) {
self.id = id
}
}
final class PersonModel: BaseModel {
var firstName: String
var surname: String
init(id: Int, firstName: String, surname:String) {
self.firstName = firstName
self.surname = surname
super.init(id: id)
}
}
func genericsTest<C: BaseModel>(with object: C) {
print("Class type: \(C.self)")
}
var person0 = PersonModel(id: 0, firstName: "John", surname: "Doe")
genericsTest(with: person0)
// This prints: "Class type: PersonModel"
var person1 = PersonModel(id: 1, firstName: "John1", surname: "Doe")
var person2 = PersonModel(id: 2, firstName: "John2", surname: "Doe")
var person3 = PersonModel(id: 3, firstName: "John3", surname: "Doe")
var personArray: [BaseModel] = [person0, person1, person2, person3]
for person in personArray {
print("Class type in for loop: \(person.self)")
// This prints: "Class type in for loop: __lldb_expr_195.PersonModel"
genericsTest(with: person)
// This prints: "Class type: BaseModel"
}
所以在for循环中,如果我打印object.self,我得到了我期望的类,但是在使用泛型的函数中执行相同的调用,我得到了基类。
修改1:
因此,如果能够使Generic C成为最终模型的类型,我将能够创建类似的东西:
func genericsTest<C: BaseModel>(with type: C.Type, and object: C) {
let test = KeyPath<C, Int>
}
就像例子一样
答案 0 :(得分:0)
看看这个 Question
您定义了一个类型为&#39; BaseModel&#39;的数组。所以在你的for循环中它基本上是在说
for let person: BaseModel in personArray
制作BaseModel类型的人
在功能中:
func genericsTest<C: BaseModel>(with object: C) {
print("Class type: \(C.self)")
}
您正在使用该类型,相反,在此代码中:
print("Class type in for loop: \(model.self)")
您正在使用该对象。如果您将C
更改为object
,您将获得相同的结果。
请记住,如果要在项目中使用它来确定这是什么类型的对象。你需要认真回到你的绘图板。因为这不是OOP!