作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我反对这个问题。
我有一个 BaseModel,里面有一些变量和一些继承自 BaseModel 的普通“最终”模型。
如果我有一个包含类 BaseModel 的数组,其中包含一些最终模型,然后循环这些模型并将它们发送到使用泛型的函数。并检查我得到的泛型类,它们来自 BaseModel 类,而不是我需要的最终类模型。如何以动态方式检索最终模型的类。当然,我可以类型转换它们,但我很想找到更好的解决方案。
请参阅我在 Playground 上制作的示例:
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>
}
举个例子
最佳答案
看看这个 Question
您定义了一个“BaseModel”类型的数组,因此在 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!
关于arrays - Array 中的 Swift 泛型子类行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44947131/
我是一名优秀的程序员,十分优秀!