假设我有一个枚举,例如:
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
?
答案 0 :(得分:2)
是的,在这些示例中,AnimalType.Dog.barks()
实例化AnimalType
。
毕竟,barks()
是一种实例方法。除了实例之外,它不能被调用。
实例的生命周期非常短。只需要足够长的时间来调用barks()
方法即可。
答案 1 :(得分:1)
我整理了一个小型测试项目并通过Instruments运行,我的调查结果与@ martin-r相似。虽然有意义的是创建一个新的枚举实例,但它似乎在编译时被优化掉了。
在此屏幕截图中,您可以看到该方法中执行的唯一分配来自首次使用println():
答案 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
“被实例化”。虽然编译器可能会内联函数并且无论如何都要优化参数。