【问题标题】:Swift: Get subclass variable after init in switchSwift:在开关中初始化后获取子类变量
【发布时间】:2017-07-03 11:46:25
【问题描述】:

我想不出一个好的标题。

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

请发送帮助,我想解决办法太久了。

【问题讨论】:

  • 你的意思是:这行不通。有错误吗?如果是这样,请发布错误。
  • @J.Paravicini 'Animal' 类型的值没有成员 'bark'...尽管很明显它被初始化为狗。
  • 问题是你用“Animal”类型声明了animal值变量,即使你给它分配了一个“Dog”变量,它仍然是animal类型。您可以将其向下转换为 roght 变量
  • 我没有真正看到使用 animal 局部变量在这里 - 只是初始化并返回各自的 case 正文中的实例。

标签: swift class enums


【解决方案1】:

因为函数“bark”的定义仅在“Dog”类中,而您正试图在“Animal”上调用它。 一种选择是制作一个接口并通过“Animal”实现它 或以下是将对象转换为“狗”的另一个选项。

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

【讨论】:

    【解决方案2】:

    使用DogCat 类型初始化animal 而不是使用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
    }
    

    【讨论】:

    • 这些转换永远不会成功,因为Animal 实例不是DogCat
    • 在切换它对 AnimalType 而不是 Animal 的检查。
    • 尝试运行它 - 狗永远不会吠叫。
    【解决方案3】:

    返回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()
    

    【讨论】:

      猜你喜欢
      • 2017-03-20
      • 2016-07-28
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多