Swift中如何判断Any类型是值类型还是引用类型?
如何判断Swift中
Any实例是值类型还是引用类型? 刚好之前也遇到过类似的需求,在Swift里要搞定这个问题其实很简单,核心就是利用所有引用类型都会隐式遵守AnyObject协议这个特性来做区分,下面给你两种常用的实现方式:
基础判断:快速区分值/引用类型
直接用is关键字判断实例是否符合AnyObject——如果返回true,那就是引用类型(比如类、闭包);反之就是值类型(结构体、枚举、Int/String这类基本类型都算)。代码示例如下:
let something: Any = getSomething() if something is AnyObject { print("👈 这是引用类型") } else { print("👉 这是值类型") }
小提醒:闭包在Swift里也属于引用类型,所以这个判断会把闭包也归到引用类型里哦。
进阶判断:区分类实例和其他引用类型
如果需要更精准的判断,比如只想识别类的实例,而把闭包单独区分出来,可以结合Mirror来实现。Mirror能帮我们拿到实例的元数据,通过displayStyle就能区分类和闭包:
func isClassInstance(_ value: Any) -> Bool { // 先判断是不是引用类型 guard value is AnyObject else { return false } // 再通过Mirror判断是不是类实例 let mirror = Mirror(reflecting: value) return mirror.displayStyle == .class } // 使用示例 let something: Any = getSomething() if isClassInstance(something) { print("👈 这是类的实例(引用类型)") } else if something is AnyObject { print("👈 这是其他引用类型(比如闭包)") } else { print("👉 这是值类型") }
避坑提醒
- 别用
type(of:)获取类型后判断是否继承自NSObject,纯Swift类不一定会继承NSObject,这种方法会漏掉很多情况。 - 极少数场景下,被
@objc标记的结构体也会被is AnyObject识别,但本质还是值类型,一般业务里很少遇到这种情况,不用特意处理。
内容的提问来源于stack exchange,提问作者iur
相关产品推荐
相关产品推荐

