Swift:在init之后获取子类变量

时间:2017-07-03 11:46:25

标签: swift class enums

我无法想到一个好的头衔。

如果我有一个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
}

请发送帮助,我一直在努力想出一个解决方案。

3 个答案:

答案 0 :(得分:1)

因为函数'bark'的定义只在'Dog'类中,你试图在'Animal'上调用它。 一种选择是创建一个界面并通过'Animal'实现它 或者以下是将对象转换为'Dog'的另一种选择。

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

答案 1 :(得分:0)

而不是使用animal运算符初始化类型为DogCat 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()