“强制转换为Any”,但属性的类型为UIColor

Dan*_*ger 1 xcode optional swift

这个

NSAttributedString.Key.foregroundColor: view.tintColor
Run Code Online (Sandbox Code Playgroud)

触发此警告

NSAttributedString.Key.foregroundColor: view.tintColor
Run Code Online (Sandbox Code Playgroud)

但是警告不应该是

Expression implicitly coerced from 'UIColor?' to 'Any'
Run Code Online (Sandbox Code Playgroud)

由于这个财产

NSAttributedString.Key.foregroundColor
Run Code Online (Sandbox Code Playgroud)

是类型UIColor

屏幕截图

注:这只是开始更新后发生在斯威夫特5Xcode的10.2

这里是更多上下文:

override func viewDidLoad() {
        super.viewDidLoad()
        UIBarButtonItem.appearance().setTitleTextAttributes(
            [
             NSAttributedString.Key.font: UIFont.systemFont(ofSize: 40),
             NSAttributedString.Key.foregroundColor: view.tintColor
            ], for: .normal)
    }
Run Code Online (Sandbox Code Playgroud)

Rob*_*ier 5

这与无关.foregroundColor。它与.tintColor和有关setTitleTextAttributes

此参数的类型为[NSAttributedString.Key : Any]。绝不考虑每个密钥的文档。它不知道或不在乎这应该是一个UIColor。如果您通过了“ squid”,那么它将在没有警告的情况下进行编译(虽然不起作用,但是会编译):

UIBarButtonItem.appearance().setTitleTextAttributes(
    [
        .font: UIFont.systemFont(ofSize: 40),
        .foregroundColor: "squid",
    ], for: .normal)
Run Code Online (Sandbox Code Playgroud)

它所要查看的就是您正在分配view.tintColor一个type值Any

问题是view.tintColor不是UIColor,而是UIColor!。实际上不可能为.tintColornil,但可以将其设置为nil:

view.tintColor        // r 0.0 g 0.478 b 1.0 a 1.0
view.tintColor = .red
view.tintColor        // r 1.0 g 0.0 b 0.0 a 1.0
view.tintColor = nil
view.tintColor        // r 0.0 g 0.478 b 1.0 a 1.0
Run Code Online (Sandbox Code Playgroud)

在ObjC中这很有意义,但是在Swift中表达它的唯一方法是使用!类型。当您将!类型分配给其他事物时,它们将成为?类型。这意味着您正在UIColor?接受的地方Any(字典的值)使用。

使用可选的as Any可能很危险,因为它会创建很多奇怪的极端情况。例如,您不能通过Any来回传递可选内容;它被压缩为基本类型:

let x: Any = Optional(1)
x as? Int? // Cannot downcast from 'Any' to a more optional type 'Int?'
x as? Int  // 1
Run Code Online (Sandbox Code Playgroud)

与Any一起使用时,会有很多这样的小技巧。

当然,您并不是与Any合作。这不是你的错。但这就是Swift抱怨的原因。

根据您的喜好,有几种解决方案。您可以使用!

    .foregroundColor: view.tintColor!
Run Code Online (Sandbox Code Playgroud)

您可以添加as Any警告以使其静音:

    .foregroundColor: view.tintColor as Any
Run Code Online (Sandbox Code Playgroud)

我个人会用as Any

或者,您可以详细说明并更早地卸载该值(我不建议这样做):

let tintColor = view.tintColor ?? .blue

UIBarButtonItem.appearance().setTitleTextAttributes(
    [
        .font: UIFont.systemFont(ofSize: 40),
        .foregroundColor: tintColor,
    ], for: .normal)
Run Code Online (Sandbox Code Playgroud)