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”隐式强制表达的表达式?去任何的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中使用具有隐式/强制展开的移位运算符

java 强制类型转换的规则是啥?

类型转换

使用标识符/标签 (SWIFT) 从 UIView 获取 UITextField

显示类型与隐式类型

使用 UIPanGestureRecognizer 从 CGRect 获取 UIView - Swift 2.0