gpt4 book ai didi

arrays - Array 中的 Swift 泛型子类行为

转载 作者:行者123 更新时间:2023-11-30 12:19:45 26 4
gpt4 key购买 nike

所以我反对这个问题。

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com