直接调用Swift枚举实例方法是否创建实例?

时间:2015-09-08 15:45:21

标签: ios macos swift enums

假设我有一个枚举,例如:

enum AnimalType {
    case Dog
    case Cat

    func barks() -> Bool {
        switch self {
        case Dog:
            return true
        case Cat:
            return false
        }
    }
}

如果我那么做的话:

func pickAnimal(shouldBark: Bool) {

    switch shouldBark {

    case AnimalType.Dog.barks():
        println("you should pick dogs")

    case AnimalType.Cat.barks():
        println("you should pick cats")

    default:
        println("don't pick cats or dogs")
    }
}

调用AnimalType.Dog.barks()AnimalType.Cat.barks()是否会实例化AnimalType

3 个答案:

答案 0 :(得分:2)

是的,在这些示例中,AnimalType.Dog.barks()实例化AnimalType

毕竟,barks()是一种实例方法。除了实例之外,它不能被调用。

实例的生命周期非常短。只需要足够长的时间来调用barks()方法即可。

答案 1 :(得分:1)

我整理了一个小型测试项目并通过Instruments运行,我的调查结果与@ martin-r相似。虽然有意义的是创建一个新的枚举实例,但它似乎在编译时被优化掉了。

在此屏幕截图中,您可以看到该方法中执行的唯一分配来自首次使用println():

Instruments

答案 2 :(得分:0)

“实例化AnimalType”是什么意思?

类似struct或enum的值类型的实例方法在编译时被解析,因此它等同于调用一个静态函数,该函数将接收器作为名为self的参数。 (变异方法等同于inout self参数;非变异方法(如bark)等同于常规self参数。)所以你的问题基本上等同于询问:“评估barks(AnimalType.Dog)(如果某个函数barks采用AnimalType)实例化AnimalType

AnimalType是一个枚举,其案例没有关联值。所以基本上它相当于一个整数(除了类型安全)。因此,您的问题等同于询问:“评估barks(42)(如果有barks函数Int实例化Int吗?

看看这是一个多么愚蠢的问题?我的意思是,在某种意义上,在函数内部,会有一个参数,该参数将具有类型Int。如果这是一个按值参数,那么根据定义,我猜测该函数范围内存在Int的新副本,因此Int“被实例化”。虽然编译器可能会内联函数并且无论如何都要优化参数。