.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
已重命名为 Bundle
。
Bundle
的 init(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?