Swift 3:从“UIView”隐式强制表达的表达式?去任何
Posted
技术标签:
【中文标题】Swift 3:从“UIView”隐式强制表达的表达式?去任何【英文标题】:Swift 3: Expression implicitly coerced from 'UIView?' to Any 【发布时间】:2016-11-02 18:06:17 【问题描述】:其他人在将 ios 项目转换为 Swift 3 时(或之后)一定收到了此消息,但是当我进行 Google 搜索时,我没有得到相关结果。
无论如何,在转换为 Swift 3 后,我有大约 30 条警告说:
表达式从 'UIView?' 隐式强制到任何
但警告并不指向任何特定的代码行。它们仅引用存在警告的类。 有没有人了解这个警告或者我可以如何让他们沉默?
【问题讨论】:
在我安装 Xcode 8.1 (8B62) 后发生了这种情况。在我的例子中,我将一个 String 对象发送到 Any 对象类型的方法。在这种情况下,警告是有意义的 尝试找到将 UIView 对象传递给 Any 类型的位置。 我真的很想知道如何获取这些警告的行号! “警告不指向任何特定的代码行”这一事实是一个错误并已得到修复。但警告本身将持续存在。例如,当我print
一个 Optional 时,我会收到此警告。我觉得这个警告很烦人。任何应该意味着任何。为什么不应该我通过 UIView?
应该是 Any?
【参考方案1】:
在我的情况下,这是与没有明确类型的字典有关的问题:
let dict = ["key": value]
比我解决的指定类型:
let dict: [String: Any] = ["key": value]
在您的情况下,您可以指定您的值类型:
let dict: [String: UIView] = ["key": value]
【讨论】:
这绝对是我收到警告的原因。对我来说,它是在我们用于自动布局的视图字典中添加显式类型。let views: [String: UIView] = ["button": button]
几周前我对代码进行了添加,但没有意识到它已经清除了这些警告。谢谢大佬!
Any
不同于Optional(Any)
,即Any?
,因此您必须确保该值是某种非空类型。【参考方案2】:
当您调用的函数具有 Any 类型的参数并且您传递的是 可选 时,就会发生这种情况。
例如:
let color: UIColor? = UIColor.red
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: color], for: .normal)
注意 color 的类型是 UIColor? 并且 setTitleTextAttributes 需要一个类型为 [String: Any] 的字典?。
为了避免警告,您必须强制解开您的可选项,或将其强制转换为 Any。
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: color!], for: .normal)
或
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: color as Any], for: .normal)
【讨论】:
对我来说就是这样。我有一个 [String: Any] 类型的字典,并使用了 dict = [ "foo" : bar ] 的赋值,其中 bar 的类型是 String? (选修的)。通过将警告替换为 dict = [ "foo" : bar ?? "" ] - 如果 bar 为 nil,则该值将设置为空字符串,这正是我在这种情况下想要的。【参考方案3】:看起来像是 Swift 编译器中的一个错误:
https://bugs.swift.org/browse/SR-2921
目前,我在 Xcode 8.1 和 8.2 beta 1 中看到了这一点。
在您的情况下,警告应该识别源文件,而不是行 - 正如您所说。您将不得不四处寻找对带有Any
参数的函数的调用。
好消息是它似乎已在即将推出的 Swift 工具链中修复。
我相信这在 Xcode 8.3 beta 1 中已修复(但尚未确认)
【讨论】:
【参考方案4】:问题
预期的类型是Any
,但提供的类型是UIView?
问题在于可选,只要确保UIView
的实例被传递并且一切正常。
【讨论】:
以上是关于Swift 3:从“UIView”隐式强制表达的表达式?去任何的主要内容,如果未能解决你的问题,请参考以下文章