gpt4 book ai didi

swift - 检查 AnyClass 变量是否是类的扩展或实现

转载 作者:搜寻专家 更新时间:2023-10-30 22:34:41 26 4
gpt4 key购买 nike

有一个 AnyClass 类型的变量,是否可以知道该类型是另一种类型的扩展还是实现?

例如:

var aClass: AnyClass = UIButton.self

// assuming a fictional operator "isOfType"
// Both UIButton and UILabel are subclasses of UIView
aClass isOfType UIButton // true
aClass isOfType UIView // true
aClass isOfType UILabel // false

一种可能的方法是创建一个实例,但创建这样的实例可能并不总是可取的:

var aClass: AnyClass = UIButton.self

let buttonClass = aClass as? UIButton.Type
var aButton: AnyObject = buttonClass!()
aButton is UIButton // true
aButton is UIView // true
aButton is UILabel // false

是否有其他方法来检查 AnyClass 是否包含扩展另一个类型的类型?

最佳答案

如果接收类继承自NSObject,您可以使用isSubclassOfClass

let c = UIButton.self
print(c.isSubclassOfClass(UIButton.self)) // true
print(c.isSubclassOfClass(UIView.self)) // true
print(c.isSubclassOfClass(UILabel.self)) // false

更新:虽然 isSubclassOfClass 是在 NSObject 中定义的,但它似乎可用于未明确派生自 的 Swift 类>NSObject 也是。下面的代码在 Xcode 7 beta 6 中按预期工作。

class A {
}

class B: A {
}

class C {
}

let c: AnyClass = B.self
print(c.isSubclassOfClass(A.self)) // true
print(c.isSubclassOfClass(B.self)) // true
print(c.isSubclassOfClass(C.self)) // false

出于兼容性原因,我相信不从 NSObject 继承的 Swift 类仍然共享它的一些方法。然而,我找不到关于此的任何官方文档,而且 Xcode 甚至不允许我从上面的代码片段导航到 isSubclassOfClass 的声明。

更新 2:无论类是否从 NSObject 继承,都可以使用的替代方法是将 is 一起使用>类型 属性。

let c: AnyClass = UIButton.self        
print(c is UIButton.Type) // true
print(c is UIView.Type) // true
print(c is UILabel.Type) // false

let c: AnyClass = B.self
print(c is A.Type) // true
print(c is B.Type) // true
print(c is C.Type) // false

关于swift - 检查 AnyClass 变量是否是类的扩展或实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32416147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com