2016-09-23 106 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