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

时间:2016-09-23 17:04:13

标签: swift

我有两个类(为了简化我删除其他文件,对象比Person更复杂):

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

  init(object: PersonEntity)
  {
    name = object.daysMask
  }
}

class Employer: Person
{

}

我有为我配置一个人的功能

func getConiguratedPerson(name: String) -> Person
{
  let person = Person()
  person.name = name
}

如果我想获得Person,我会这么做:

let person = getConiguratedPerson("Alex")

但如果我需要Employer而我想要使用此功能

,该怎么办?
let employer = getConiguratedPerson("Alex") // returns Person as expected but need to have employer instead.

在Objective-C中我们可以简单地做到这一点:

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

2 个答案:

答案 0 :(得分:2)

错误是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(name: "Alex")并让您使用Employer(name: "Alex")的雇主。

请注意,在ObjC中也是如此。你也不应该有getConfiguredPerson。你应该有[Person initWithName:]

答案 1 :(得分:0)

你不能在这里使用upcasting,因为配置的人不是Employee类型,而是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")

或者这个,如果按工厂方法返回的对象类型取决于输入:

func getPerson(name: String) -> Person {
    if name != "Alex" {
        return Person()
    }

    return Employee()
}

let employee = getPerson("Alex") as! Employee