Swift 3:表达式从“UIView?”隐式强制转换为Any

Swift 3: Expression implicitly coerced from 'UIView?' to Any

提问人:RyJ 提问时间:11/3/2016 最后编辑:eli-kRyJ 更新时间:3/31/2019 访问量:19001

问:

其他人在将 iOS 项目转换为 Swift 3 时(或之后)一定收到了此消息,但当我进行 Google 搜索时,我没有得到任何相关结果。

无论如何,在转换为 Swift 3 后,我有大约 30 个警告说:

表达式从“UIView?”隐式强制转换为“任何”

但警告并不指向任何特定的代码行。它们仅引用存在警告的类。
有没有人知道这个警告,或者我该如何让它们沉默?

iOS Xcode Swift3

评论

0赞 Mike.R 11/3/2016
在我安装 Xcode 8.1 (8B62) 后,它发生在我身上。就我而言,我将一个 String 对象发送到具有 Any 对象类型的方法。在这种情况下,警告是有道理的
0赞 Mike.R 11/3/2016
尝试查找将 UIView 对象传递给 Any 类型的位置。
3赞 Christopher 11/30/2016
我真的很想知道如何获取这些警告的行号!
1赞 matt 1/27/2017
“警告不指向任何特定的代码行”这一事实是一个错误,并已得到修复。但警告本身会持续存在。例如,当我是可选时,我会收到此警告。我觉得这个警告很烦人。Any 应该表示 Any。为什么我不应该在预期 Any 的地方传递?printUIView?

答:

15赞 Daniel 11/3/2016 #1

看起来像 Swift 编译器中的错误:

https://bugs.swift.org/browse/SR-2921

目前,我在 Xcode 8.1 和 8.2 beta 1 中看到了这一点。

在您的情况下,警告应标识源文件,而不是行 - 如您所述。您将不得不四处寻找对带有参数的函数的调用。Any

好消息是,它似乎在即将到来的 Swift 工具链中得到了修复。

我相信这在 Xcode 8.3 beta 1 中已修复(但尚未确认)

33赞 Michael Peterson 11/7/2016 #2

当您调用的函数具有 Any 类型的参数并且您传递可选参数时,将发生这种情况。

例如:

let color: UIColor? = UIColor.red
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: color], for: .normal)

请注意,color 的类型为 UIColor?,而 setTitleTextAttributes 需要 [String: Any]?类型的字典。

为了避免警告,您必须强制解开 optional,或将其转换为 Any。

UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: color!], for: .normal)

UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: color as Any], for: .normal)

评论

2赞 n13 11/29/2016
对我来说就是这样。我有一个 [String: Any] 类型的字典,并使用了 dict = [ “foo” : bar ] 的赋值,其中 bar 的类型为 String?(可选)。通过用 dict = [ “foo” : bar ??“” ] - 这样,如果 bar 为 nil,则该值将设置为空字符串,这是我在这种情况下想要的。
35赞 2 revs, 2 users 78%Madson Cardoso #3

就我而言,这是一个与没有显式类型的字典相关的问题:

let dict = ["key": value]

比我解决了指定类型的问题:

let dict: [String: Any] = ["key": value]

在您的情况下,您可以指定值类型:

let dict: [String: UIView] = ["key": value]

评论

1赞 RyJ 11/23/2016
这绝对是我收到警告的原因。对我来说,它是将显式类型添加到我们用于自动布局的视图字典中。 几周前,我在代码中添加了该内容,但没有意识到它已经清除了这些警告。谢谢伙计!let views: [String: UIView] = ["button": button]
1赞 DawnSong 1/4/2017
Any与 不同,即 ,因此您必须确保 value 是某种非 null 类型。Optional(Any)Any?
1赞 user1046037 3/31/2019 #4

问题

预期的类型是,但提供的类型是AnyUIView?

问题出在可选的,只需确保传递了一个实例,事情就会起作用。UIView