在 Swift 中检查值或引用类型

Posted

技术标签:

【中文标题】在 Swift 中检查值或引用类型【英文标题】:Check for value or reference type in Swift 【发布时间】:2016-01-11 15:39:28 【问题描述】:

我们如何检查函数中传递的参数是值类型还是引用类型?例如

func isReferenceType(toTest: Any) 
    return true // or false

正如我们看到的here,我们无法利用泛型来做到这一点。

【问题讨论】:

我没试过,但没有解决办法。 2 在您发布的链接中为您工作? is AnyObject 呢? 对于 Swift 3 和 Xcode 8 - ***.com/a/40538595/746347 【参考方案1】:

AnyObject是任何类类型自动遵循的协议,所以你可以这样写:

func isReferenceType(toTest: Any) -> Bool 
    return toTest.dynamicType is AnyObject


class Foo  
struct Bar  

isReferenceType(Foo())    // true
isReferenceType(Bar())    // false
isReferenceType("foo")    // false
isReferenceType(123)      // false
isReferenceType([1,2,3])  // false

【讨论】:

是的,但isReferenceType("foo")isReferenceType(123)isReferenceType([1, 2, 3]) 也将返回 true(如果已导入 Foundation)。 啊,老沉默演员。检查动态类型而不是值本身似乎可以解决... 或者:func isReferenceType<T: Any>(toTest: T) -> Bool return !(T.self is AnyObject) 【参考方案2】:

斯威夫特 5

func isReferenceType(_ toTest: Any) -> Bool 
    return type(of: toTest) is AnyClass

【讨论】:

以上是关于在 Swift 中检查值或引用类型的主要内容,如果未能解决你的问题,请参考以下文章

javascript检测基本类型值或引用类型值的类型方法

将泛型与可能是值或引用类型的 null 进行比较?

Swift - 值类型和引用类型的区别

Swift 值类型和引用类型

Swift如何实现通用类型的弱引用数组(上)

Swift如何实现通用类型的弱引用数组(下)