【问题标题】:Why does type(of: object) == ClassName.self return a wrong result?为什么 type(of: object) == ClassName.self 返回错误的结果?
【发布时间】:2019-05-22 14:08:20
【问题描述】:

我有以下代码:

class Mode { ... }
class TimelapseMode: Mode { ... }
var mode: Mode! = TimelapseMode()

当我检查 type(of: mode) == TimelapseMode.self 时,它返回 false,这显然是错误的。我通过设置断点和打印模式确认,确实是TimelapseMode

但是 type(of: mode) === TimelapseMode.selfmode is TimelapseMode 都返回 true。

是不是元类型类没有正确实现 == 操作符?

我是否应该检查整个代码库,将 == 的这种用法替换为 ===?

【问题讨论】:

  • 对我来说type(of: mode) == TimelapseMode.self 也返回 true
  • 我也无法重现该问题。
  • 你不是说type(of: mode) == Mode.self返回false吗?
  • 该变量是一个隐式展开的可选。我用该信息更新了问题。很抱歉之前忘记了。 == 返回 false 并且 === 返回 true 的情况仍然如此。我不明白为什么会这样。

标签: swift polymorphism instanceof rtti typeof


【解决方案1】:

Type.self 可以通过在类型上调用 .self 来找到类型的元类型。返回的类型可以是 Class 元类型、Struct 元类型或 Protocol 元类型。

class Mode {

}


class TimeslapeMode: Mode {

}

var mode: Mode = Mode()

print(type(of: mode))
print(TimeslapeMode.self)

print(type(of: mode) === TimeslapeMode.self)
print(type(of: mode) == TimeslapeMode.self)

print(type(of: mode))
print(type(of: TimeslapeMode.self))

Output -
Mode
TimeslapeMode
false
false
Mode
TimeslapeMode.Type

【讨论】:

  • 该变量是一个隐式展开的可选。我用该信息更新了问题。很抱歉之前忘记了。 == 返回 false 并且 === 返回 true 的情况仍然如此。我不明白为什么会这样。
  • 我写了两种情况的代码==或者===都返回true。
  • 将模式类型更改为模式!并再次运行您的代码
  • 当然它返回 false 因为模式类型是 Mode 而 TimeslapMode.self 是返回 TimeslapMode 类类型。
  • 不,mode的静态类型是Mode!但动态类型是TimelapseMode。再次阅读我更新的问题。为什么 === 和 is 返回 true 而 == 返回 false?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 2014-01-05
  • 2016-05-28
  • 2015-10-22
  • 1970-01-01
  • 2015-05-15
相关资源
最近更新 更多