获取一个公共枚举属性,而不必匹配每种情况



我在Swift中有以下枚举:

enum Animal {
    case Cat(name: String, color: String)
    case Dog(name: String, tailLength: Double)
    case Cow(name: String, isBrown: Bool)
}

有没有一种方法可以在没有开关的情况下逐个获得动物的名称?类似于:

func animalName(a: Animal) -> String {
    // This does not work, you have to use a switch
    return a.name
}

如果所有动物类型都有名称属性,那么我认为最好将其明确化。

enum AnimalType {
    case Cat(color: String)
    case Dog(tailLength: Double)
    case Cow(isBrown: Bool)
}
struct Animal {
    let name: String
    let type: AnimalType
}

我认为上面的答案会比@JanGreve的答案更好,因为它可以让你简单地做:

func animalName(a: Animal) -> String {
    // Now the below will work.
    return a.name
}

通过这种方式从对象中提取名称要容易得多,因为您不需要执行if大小写或switch大小写。

据我所知,没有修改枚举(例如,使用继承或使用协议(在这种情况下可能是可打印的))

编辑以容纳评论:

如果你可以自由定义数据结构,你可以使用这样的东西:

enum Animal {
    case Cat(color: String)
    case Dog(tailLength: Double)
    case Cow(isBrown: Bool)
}
enum NamedAnimal {
    case NamedAnimal(name: String, animal:Animal)
}

编辑二:

func namedAnimalName(namedAnimal:NamedAnimal) -> String {
    switch namedAnimal {
      case .NamedAnimal(let n, _): return n
    }
}
enum Animal {
    case Cat(name: String, color: String)
    case Dog(name: String, tailLength: Double)
    case Cow(name: String, isBrown: Bool)
}
let a1: Animal = .Cat(name: "cica", color: "black")
let a2: Animal = .Dog(name: "dunco", tailLength: 10.2)

func animalName(a: Animal)->String {
    return "(a)".characters.split(""").map(String.init)[1]
}
animalName(a1) // "cica"

相关内容

最新更新