有没有办法检查委托是值还是引用类型?
Is there a way to check if a delegate is a value or a reference type?
假设我们有这样的事情:
protocol Delegate {}
struct Value: Delegate {}
class Reference: Delegate {}
struct Test {
let delegate: Delegate
}
我们如何知道委托是结构(值类型)还是 class(引用类型)?
首先想到的是在复制委托后检查内存地址是否相等:
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
}
}
- 甚至可以这样做吗?
- 还有更多elegant/correct方法吗?
- 复制值类型可能是一项昂贵的操作?
每个 class 都符合 AnyClass
协议。但是枚举和结构不会。利用它,您可以检查它是 class 还是结构(甚至是枚举)
struct Test {
let delegate: Delegate
var isReferenceType: Bool {
return type(of:delegate) is AnyClass
}
}
假设我们有这样的事情:
protocol Delegate {}
struct Value: Delegate {}
class Reference: Delegate {}
struct Test {
let delegate: Delegate
}
我们如何知道委托是结构(值类型)还是 class(引用类型)?
首先想到的是在复制委托后检查内存地址是否相等:
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
}
}
- 甚至可以这样做吗?
- 还有更多elegant/correct方法吗?
- 复制值类型可能是一项昂贵的操作?
每个 class 都符合 AnyClass
协议。但是枚举和结构不会。利用它,您可以检查它是 class 还是结构(甚至是枚举)
struct Test {
let delegate: Delegate
var isReferenceType: Bool {
return type(of:delegate) is AnyClass
}
}