斯威夫特3:表达隐含地强加于'UIView?' 去任何

RyJ*_*RyJ 52 xcode ios swift3

其他人必须在将iOS项目转换为Swift 3时(或之后)收到此消息,但是当我进行Google搜索时,我得不到相关结果.

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

表达隐含地从'UIView?'强制执行 去任何

但警告并未指出任何特定的代码行.它们仅引用存在警告的类.
有没有人对这个警告有所了解,或者我如何对它们进行沉默?

小智 35

在我的情况下,这是一个与没有显式类型的字典有关的问题:

let dict = ["key": value]
Run Code Online (Sandbox Code Playgroud)

比我解决了指定类型:

let dict: [String: Any] = ["key": value]
Run Code Online (Sandbox Code Playgroud)

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

let dict: [String: UIView] = ["key": value]
Run Code Online (Sandbox Code Playgroud)


Mic*_*son 30

当您调用的函数具有Any类型的参数并且您正在传递可选项时,会发生这种情况.

例如:

let color: UIColor? = UIColor.red
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: color], for: .normal)
Run Code Online (Sandbox Code Playgroud)

请注意,颜色UIColor类型并且setTitleTextAttributes需要一个类型为[String:Any]的字典.

为了避免警告,您必须强制打开可选项,或将其强制转换为Any.

UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: color!], for: .normal)
Run Code Online (Sandbox Code Playgroud)

要么

UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: color as Any], for: .normal)
Run Code Online (Sandbox Code Playgroud)

  • 那是给我的.我有一个[String:Any]类型的字典,并使用了dict = ["foo":bar]的赋值,其中bar是String类型的?(可选的).通过用dict = ["foo":bar ??替换它来消除警告 ""] - 如果bar为nil,则将值设置为空字符串,这是我在这种情况下想要的. (2认同)

Dan*_*iel 15

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

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

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

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

好消息是它在即将推出的Swift工具链中看起来很复杂.

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

  • Xcode版本8.2.1(8C1002)中仍然存在Bug (6认同)