gpt4 book ai didi

swift - 使用 type(of : ) and isMember(of: )) 的比较之间的差异

转载 作者:行者123 更新时间:2023-11-28 10:52:30 29 4
gpt4 key购买 nike

我试图在不同类的数组中寻找特定类的实例(在 TabBarViewController 中寻找特定 ViewController 的索引)

我有一个使用 type(of:) 检查类型的代码,但它不起作用:

func getTabIndex(_ rootClass: AnyClass) -> Int? {

if let tabVC = UIApplication.shared.delegate?.window?!.rootViewController as? UITabBarController {
for (index, vc) in tabVC.viewControllers!.enumerated() {
if type(of: vc) == rootClass {
return index
}
}
}

return nil
}

if type(of: vc) == rootClass 总是返回 false。

当我将 if type(of: vc) == rootClass 更改为 vc.isMember(of: rootClass) 时,它工作正常。

我假设 isMember(of:) 是 obj-c 方法,而 type(of:) 是纯粹的 swift,但我不明白为什么它会对 UIViewController 产生影响。

有人可以解释为什么 type(of: ) 在这种情况下不起作用吗?在这两种情况下,我都在比较确切的类型,而不是子类。 TabBar 有 FooViewController 和 BarViewController 的实例。当我调用 getTabIndex(FooViewController.self) 时,使用 type(of:) 时得到 nil,使用 isMember(of:) 时得到 0

编辑:我知道 tpye(of:) 检查确切类型,而 kind(of:) 检查子类,但在我的例子中,我检查的是确切类型,所以 type(of:) 应该工作正常,因此困惑.

当我打印 type(of: ) 的结果时,它与我打印 rootClass 的值时完全相同。我知道这仅意味着它们的文本表示相同而底层类型可能不同,但我不明白为什么会这样

编辑 2:

原始问题使用了 isKind(of:) 方法,这是一种误导,我将其更改为 isMember(of:) 以更准确地反射(reflect)我的困惑来源,这就是为什么 type(of:) 在比较确切类型时不起作用

最佳答案

类型(属于:)

用法:type(of: instance) == CheckingType.self

instance 正好是 CheckingType 时,返回真值

isKind(属于:)

此方法来自愚蠢的 Objective-C,需要 NSObjectProtocol 快速使用 instance is CheckingType

用法:instance.isKind(of: CheckingType.self)

instanceCheckingType 或继承自 CheckingType 时返回 true

isKind(of:) 的 Swift 版本

用法:实例是CheckingType

instanceCheckingType 或继承自 CheckingType 时返回 true


例子

import Foundation

class Animal: NSObject { }
class Cat: Animal { }

Cat() is Cat // true
Cat() is Animal // true
Cat().isKind(of: Animal.self) // true
Cat().isKind(of: Cat.self) // true
type(of: Cat()) == Animal.self // false
type(of: Cat()) == Cat.self // true

关于swift - 使用 type(of : ) and isMember(of: )) 的比较之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45463617/

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