2016-09-23 31 views
1

我有两个班(简化我将其他申请对象较为复杂,则人):Swift继承问题。如何获得适当的类对象

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

的错误是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:]

+0

谢谢您的回答,但如何建立工厂方法然后?如果我不需要类似于工厂方法模式的方法。或者例如索引路径中的行的单元格也返回UITableViewCell,但是您可以配置任何单元格(如果需要) –

+0

对于cellForRow,您通常需要泛型和as!投。对于最常见的“返回自我类”的情况,由于继承问题,这对于类是不可能的(搜索“协议返回自我”,您应该在SO上找到关于它的许多讨论)。在任何情况下都没有一个普遍的答案。你需要一个明确的问题来解决你想要做的事情。在你描述的情况下,init是正确的。你想要一个工厂有什么具体问题? –

+0

尤其是,大多数代码中不能“配置任何想要的单元格”。你需要知道你要返回的是什么样的单元格(否则,你将如何配置它?)。如果您知道,那么泛型通常是答案。 –

0

此处不能使用上传,因为配置的人员不是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