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?
注:这只是开始更新后发生在斯威夫特5,Xcode的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)
这与无关.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)