2017-07-03 34 views
0

我想不出一个好的标题。Swift:在初始化开关后获取子类变量

如果我有一个switch语句,其中我从一个类初始化子类,那么它不会让我使用子类的任何函数或变量。这就是我的意思:

class Animal {} 

class Cat: Animal {} 

class Dog: Animal { 
    func bark() { 
    print("SWIFT DOES NOT LET ME BARK") 
    } 
} 

enum AnimalType { 
    case cat, dog 
} 

func getAnimal(type: AnimalType) -> Animal { 
    let animal: Animal 
    switch type { 
    case .cat: 
    animal = Cat() 
    case .dog: 
    animal = Dog() 
    animal.bark() // Value of type 'Animal' has no member 'bark' 
    } 
    return animal 
} 

请发送帮助,我一直在想办法解决太久。

+0

什么你的意思做:这是行不通的。有错误吗?如果是这样,请发布错误。 –

+0

@ J.Paravicini类型'动物'的价值没有成员'树皮'...即使它已经被初始化为狗。 – MysteryPancake

+0

问题是,你用“动物”类型声明了动物值变量,即使你给它分配了一个“狗”变量,它仍然是动物类型。你可以将它下载到roght变量 –

回答

0

的,而不是只使用向上转型操作者as?

修改函数等

func getAnimal(type: AnimalType) -> Animal { 
    var animal = Animal() 
    switch type { 
    case .cat: 
     let cat = animal as? Cat 
    case .dog: 
     let dog = animal as? Dog 
     dog?.bark() 
     // Value of type 'Animal' has no member 'bark' 
    } 
    return animal 
} 
+0

这些演员永远不会成功,因为“Animal”实例不是“Dog”或“Cat”。 – Hamish

+0

在切换检查动物类型而不是动物。 –

+0

尝试运行它 - 狗永远不会吠叫。 – Hamish

1

因为函数'bark'的定义只在'Dog'类中,而您试图在'Animal'中调用它。 一种选择是制作一个界面并通过'Animal' 来实现它,或者下面是将对象投射到'Dog'的另一个选项。

(animal as! Dog).bark() // Value of type 'Animal' has no member 'bark' 
0

的函数返回一个Animal也可以返回任何亚类Animal初始化animalDog类型或Cat

func getAnimal(type: AnimalType) -> Animal { 
    switch type { 
    case .cat: 
     return Cat() 
    case .dog: 
     let dog = Dog() 
     dog.bark() 
     return dog 
    } 
} 

但使用对象的功能外,你必须用(例如)as! Dog投它:

let dog = getAnimal(type: .dog) as! Dog 
dog.bark()