.dynamicType 已弃用。改用'type(of ...)'

Posted

技术标签:

【中文标题】.dynamicType 已弃用。改用\'type(of ...)\'【英文标题】:.dynamicType is deprecated. Use 'type(of ...)' instead.dynamicType 已弃用。改用'type(of ...)' 【发布时间】:2017-01-22 12:43:35 【问题描述】:

我刚刚更新到 Xcode 8 和 ios 10(使用旧的 Swift 语言版本)。

尝试再次编译我的项目一直很痛苦,即使仍然使用旧的 Swift 语法。这次我的一个函数使用了NSBundle(forClass: self.dynamicType),但现在看来.dynamicType 已被弃用,Xcode 甚至不想编译它。

他的建议是使用type(of: self),但也失败了。有人知道解决方案吗?谢谢。

【问题讨论】:

NSBundle(forClass: self.dynamicType) 在 Swift 2.3 中对我来说编译得很好,你确定“使用旧版 Swift 语言版本”设置为“是”吗?您可以随时尝试清理构建文件夹。 是的,设置好了,我可以看到效果,因为语法错误的数量从30个减少到1个。我的看法是这个错误与新的iOS 10 SDK中更新的新UIKit框架有关,这就是为什么当我更新到 Xcode 8 时,它似乎甚至激活了遗留的 Swift 语法。 别在意我的最后一句话,UIKit 还是一样的 【参考方案1】:

(以下适用于 Swift 3;但不是旧版 Swift 语言版本 (2.3),因此它不能回答 OP 的问题,但对于 Swift 3 用户可能很有价值)

如您的问题所述,dynamicType 现在 (Swift 3) 已弃用,取而代之的是 type(of:)。另外:

NSBundle 已重命名为 BundleBundleinit(forClass:) 初始化程序已重命名为 init(for:)

考虑到这些变化,对于 Swift 3,您可以通过以下方式初始化(​​或获取与特定类关联的现有实例)您的 Bundle 对象:

class Foo 
    func bar() -> () 
        let bundle = Bundle(for: type(of: self))
        // ...
    

【讨论】:

OP 使用的是旧的 Swift 版本,也就是 Swift 2.3 - 所以 AFAIK 他当前的代码应该是有效的 没问题,我第一眼也是这么想的! type(of: self) 是什么?它从何而来?自动完成不建议我这样的代码。此外,查看文档似乎找不到与type(of: ) 相关的任何内容。但是复制粘贴完全相同的代码不会产生任何错误。也许我应该重新启动 Xcode。 @Andrej 查看release notes for Xcode 8: "dynamicType 关键字已从 Swift 中删除。取而代之的是新的原始函数 type(of:) 已添加到语言中。现有代码使用.dynamicType 成员来检索表达式类型的应该迁移到这个新的原语。”。如果您尝试在 Swift 3/Xcode 8 中使用 dynamicType,您应该会收到类似信息的提示(-> 替换为 type(of:))。【参考方案2】:

@dfri 答案非常适合 Swift 3。

关于 Swift 2.3,我的解决方案是清理 Xcode (Command+Option+Shift+K) 并删除 ~/Library/Developer/Xcode/DerivedData 中的所有内容。问题不会立即消失,但一段时间后它会停止给出该错误。

也许这是一个错误,毕竟我们是在 8.0 中。我希望它在下一个版本中得到修复。

谢谢大家。

【讨论】:

@sgonzalez 他的回答适用于 Swift 3。我使用的是旧版 Swift (2)。

以上是关于.dynamicType 已弃用。改用'type(of ...)'的主要内容,如果未能解决你的问题,请参考以下文章

httpClient.getConnectionManager() 已弃用-应该改用啥?

警告:'RaisedButton' 已弃用,不应使用。改用 ElevatedButton

Gobject 的函数 G_TYPE_INSTANCE_GET_PRIVATE 已弃用

TSlint 警告:弃用 atob 已弃用:请改用 `Buffer.from(data, 'base64')`

rxjs Subject.create 已弃用-我应该改用啥?

弃用警告:collection.findAndModify 已弃用。改用 findOneAndUpdate、findOneAndReplace 或 findOneAndDelete?