数组

时间:2017-07-06 11:03:50

标签: arrays swift generics casting

所以我反对这个问题。

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

就像例子一样

1 个答案:

答案 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!