如果实现类型是ValueType,如何传递协议实例?当您传递协议时,您不知道底层类型。可能是ValueType,也可能是ReferenceType。
我有一个struct MyStruct,它实现了一些协议VectorProtocol。然后,我有一个名为arrayMaker的函数,它基本上就是要创建MyStruct的实例并返回其中的一个实例。这个函数对于这个例子来说有点复杂,我承认。
ArrayMaker返回一个协议,但是实现类是一个ValueType。如果这是一个具体的ValueType,那么现在管理的对象的生存期究竟是怎样的呢?我甚至可以将这个协议实例作为其他类的成员存储很长时间。
基本上:我不知道从这个函数返回的实例如何能够在没有引用语义的情况下继续存在。
结构是否有可能被Swift悄悄地提升为引用语义?
import Foundation
protocol VectorProtocol {
var x: Int { get set }
var y: Int { get set }
var z: Int { get set }
}
struct MyStruct : VectorProtocol {
var x: Int;
var y: Int;
var z: Int;
}
func arrayMaker() -> VectorProtocol {
// protocolArray, and everything in it should be released
// from memory upon function exit I would think
var protocolArray: [MyStruct] = []
for _ in 1...5 {
protocolArray.append(MyStruct(x: Int.random(in: 0..<10), y: Int.random(in: 0..<10), z: Int.random(in: 0..<10)))
}
// only makes sense to me for this to live if semantics are reference
return protocolArray[3]
}
let vectorProtocol = arrayMaker()
print("Protocol has X Value: \(vectorProtocol.x)")发布于 2021-07-06 19:17:21
VectorProtocol的返回值是一个协议存在主义,它基本上是一个值周围的三个词"box“。你的价值只有三个字长,所以它将适合在盒子里。(如果它大于3个字,它将被复制到堆存储中,并且该框将管理它)。
这些3字框在堆栈上传递,因此它们不需要任何堆内存。这三个值直接放在堆栈上(连同其他一些内务管理的单词)。
如果这是一个类,那么存在主义框将只包含一个指向它的指针(以及其他一些家务管理的词)。
这一切都在2016年的WWDC大会416中解释过,理解Swift的性能,但苹果似乎已经从developer.apple.com上删除了这一点。你仍然可以在WWDC备注上找到一些关于它的笔记,并且成绩单可以通过回车机获得。
https://stackoverflow.com/questions/68275505
复制相似问题