我无法想到一个好的头衔。
如果我有一个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 :(得分:1)
因为函数'bark'的定义只在'Dog'类中,你试图在'Animal'上调用它。 一种选择是创建一个界面并通过'Animal'实现它 或者以下是将对象转换为'Dog'的另一种选择。
(animal as! Dog).bark() // Value of type 'Animal' has no member 'bark'
答案 1 :(得分:0)
而不是使用animal
运算符初始化类型为Dog
或Cat
as?
的{{1}}
修改类似
的功能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
}
答案 2 :(得分:0)
返回Animal
的函数也可以返回任何Animal
子类。
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()