Swift 快速继承问题。如何获得合适的类对象

Swift 快速继承问题。如何获得合适的类对象,swift,Swift,我有两个类(为了简化,我删除了其他字段,对象比人更复杂): 我有为我个人配置的功能 func getConiguratedPerson(name: String) -> Person { let person = Person() person.name = name } 如果我想得到Person我只需执行以下操作: let person = getConiguratedPerson("Alex") Employer *employer = Employer([self get

我有两个类(为了简化,我删除了其他字段,对象比人更复杂):

我有为我个人配置的功能

func getConiguratedPerson(name: String) -> Person
{
  let person = Person()
  person.name = name
}
如果我想得到
Person
我只需执行以下操作:

let person = getConiguratedPerson("Alex")
Employer *employer = Employer([self getConiguratedPerson:"Alex"]) if I remember.
但是如果我需要
Employer
,并且我也想使用此功能,该怎么办

let employer = getConiguratedPerson("Alex") // returns Person as expected but need to have employer instead.
在Objective-C中,我们可以简单地做到这一点:

let person = getConiguratedPerson("Alex")
Employer *employer = Employer([self getConiguratedPerson:"Alex"]) if I remember.

错误在于
getConfiguredPerson
函数。你需要一个初始值设定项。初始值设定项返回您自己的类,这正是您想要的

class Person {
  var name: String = "Default name"

  init(name: String) {
      self.name = name
  }

  init(object: PersonEntity) {
      self.init(object.daysMask)
  }
}

class Employer: Person {}
现在要创建一个人,您只需使用
person(名称:“Alex”)
,要获得雇主,您可以使用
employer(名称:“Alex”)


请注意,在ObjC中也是如此。您也不应该在那里设置
getConfiguredPerson
。您应该有
[Person initWithName::

您不能在这里使用向上转换,因为配置的Person不是员工类型,而是Person类型。为了达到预期的效果,我建议如下:

class Person {
    var name = "name"

    required init() { }
}

class Employee: Person { }

func getPerson<T: Person>(name: String) -> T {
    let person = T()
    person.name = name
    return person
}

let employee: Employee = getPerson("Alex")

谢谢你的回答,但是如何创建工厂方法呢?如果我不需要类似于工厂方法模式的方法。或者,例如,索引路径处的行的单元格也返回UITableViewCell,但如果您希望为行的单元格配置任何单元格,则通常需要泛型和as!铸造对于“类返回自身”的最一般情况,由于继承问题,这在类中是不可能的(搜索“协议返回自身”,您应该可以找到关于这方面的许多讨论)。在任何情况下都没有一个通用的答案。你需要一个明确的问题来回答你想做什么。在您描述的案例中,init是正确的。对于什么特定的问题,您需要一个工厂?特别是,您不能在大多数代码中“配置您想要的任何单元格”。您需要知道返回的单元格类型(否则,您将如何配置它?)。如果你知道,那么泛型通常是答案。我知道了,是的,我想这是个不错的答案