【问题标题】:Check for value or reference type in Swift在 Swift 中检查值或引用类型
【发布时间】:2023-03-16 18:00:01
【问题描述】:

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

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

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

【问题讨论】:

标签: swift value-type reference-type


【解决方案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
}

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2016-01-23
    相关资源
    最近更新 更多