我有两个类(为了简化我删除其他文件,对象比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.
答案 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