【问题标题】:Swift 2.2 AnyObject TypeSwift 2.2 AnyObject 类型
【发布时间】:2016-03-23 20:48:12
【问题描述】:

在 iOS 9.3 更新和 Swift 2.2 的新更新(至少在 Xcode 更新更改中说明)之后,下面的代码不再适用于我。

if context[indexPath.row].dynamicType.className() == "MyClass"

它抛出一个异常状态:

Value of type 'AnyObject.Type' has no member 'className'

我正在经历swift.org 中描述的更改,但我找不到它的答案。

【问题讨论】:

    标签: ios swift xcode swift2


    【解决方案1】:

    当您在类型系统本身中拥有真正的编译器支持时,为什么还要使用字符串呢?我建议改为:

    if context[indexPath.row].dynamicType == MyClass.Type.self {
        // ...
    }
    

    另外,你的意思很可能是:

    if let cell = context[indexPath.row] as? MyClass {
        // ...
    }
    

    除非您打算永远删除派生类。

    【讨论】:

    • 感谢您的提示! :)
    • 如果您没有明确引用MyClass(使用反射等),这将不起作用但是是的,这更干净,因为它会切断字符串。
    【解决方案2】:

    我不知道className() 做了什么。这不是AnyClass 上的已知方法。

    有几种方法可以解决此问题。

    使用description()获取类名的String描述:

    if context[indexPath.row].dynamicType.description() == "MyClass" {
        // ...
    }
    

    或者,如果您使用的是 Objective-C 类型,您可以使用 NSClassFromString 从字符串返回 AnyClass

    if context[indexPath.row].dynamicType == NSClassFromString("MyClass") {
        // ...
    }
    

    斯威夫特 3:

    dynamicType 已重命名为 type(of:)。用法:

    type(of: context[indexPath.row]) == MyClass.self
    

    context[indexPath.row] is MyClass
    

    【讨论】:

    • 谢谢!它的工作。我想确定对象是否来自类型“MyClass”或者不是......你得到了代码,但如果你不知道它在做什么,我不知道为什么它之前工作:D 我的对象类型是 AnyObject :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多