是否有一种方法来检查委托是值还是引用类型?



假设我们有这样的内容:

protocol Delegate {}
struct Value: Delegate {}
class Reference: Delegate {}
struct Test {
let delegate: Delegate
}

我们怎么知道一个委托是一个结构(值类型)还是一个类(引用类型)?

首先想到的是在复制委托后检查内存地址是否相等:

struct Test {
let delegate: Delegate
var isReferenceType: Bool {
let copy = delegate
let copyAddress = // ... get memory address of a copy
let originalAddress = // ... get memory address of an original
return copyAddress == originalAddress
}
}

  1. 这是可能的吗?
  2. 是否有更优雅/正确的方法来做到这一点?
  3. 复制值类型可能是一个昂贵的操作?

每个类都符合AnyClass协议。然而枚举和结构体不会。使用它可以检查它是一个类还是一个结构体(甚至是一个enum)

struct Test {
let delegate: Delegate
var isReferenceType: Bool {
return type(of:delegate) is AnyClass
}
}

最新更新