Swift ';强迫任何';但属性的类型为UIColor
这个 触发此警告Swift ';强迫任何';但属性的类型为UIColor,swift,xcode,optional,Swift,Xcode,Optional,这个 触发此警告 表达式从“UIColor?”隐式强制为“Any” 但这不是警告吗 表达式隐式地从'UIColor'强制为'UIColor' 因为这个财产 NSAttributedString.Key.foregroundColor: view.tintColor 是否属于UIColor 注意:这仅在更新到Swift 5,Xcode 10.2后才开始发生 这里有更多的上下文: NSAttributedString.Key.foregroundColor 只要这样做: override
表达式从“UIColor?”隐式强制为“Any”
但这不是警告吗
表达式隐式地从'UIColor'强制为'UIColor'
因为这个财产
NSAttributedString.Key.foregroundColor: view.tintColor
是否属于UIColor
注意:这仅在更新到Swift 5,Xcode 10.2后才开始发生
这里有更多的上下文:
NSAttributedString.Key.foregroundColor
只要这样做:
override func viewDidLoad() {
super.viewDidLoad()
UIBarButtonItem.appearance().setTitleTextAttributes(
[
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 40),
NSAttributedString.Key.foregroundColor: view.tintColor
], for: .normal)
}
希望这有帮助 只要这样做:
override func viewDidLoad() {
super.viewDidLoad()
UIBarButtonItem.appearance().setTitleTextAttributes(
[
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 40),
NSAttributedString.Key.foregroundColor: view.tintColor
], for: .normal)
}
希望这有帮助 这与
.foregroundColor
无关。它与.tintColor
和setTitleTextAttributes
有关
此参数的类型为[NSAttributedString.Key:Any]
。它不会以任何方式考虑每个密钥的文档。它不知道也不关心这应该是一个UIColor
。如果您传递了“squid”,那么它将在没有警告的情况下编译(它不会工作,但会编译):
它所看到的只是将view.tintColor
赋值给Any
类型的值
问题是view.tintColor
不是UIColor
,而是UIColor代码>。实际上,.tintColor
不可能为零,但可以将其设置为零:
UIBarButtonItem.appearance().setTitleTextAttributes(
[
.font: UIFont.systemFont(ofSize: 40),
.foregroundColor: "squid",
], for: .normal)
这在ObjC中是有意义的,但用Swift表达它的唯一方法是使用代码>类型。当您分配时代码>类型到其他事物,它们变成?
类型。这意味着您在一个接受Any
(字典值)的地方使用UIColor?
使用可选的asAny
可能会很危险,因为它会造成很多奇怪的情况。例如,您不能通过任意路径往返可选路径;它被压缩为其基本类型:
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
在使用任何工具时,都会有很多这样的小锐边
你当然不想和任何人一起工作。这不是你的错。但这就是斯威夫特抱怨的原因
根据您的喜好,有几种解决方案。您可以使用代码>:
let x: Any = Optional(1)
x as? Int? // Cannot downcast from 'Any' to a more optional type 'Int?'
x as? Int // 1
您可以添加作为任何
,以使警告静音:
.foregroundColor: view.tintColor!
就我个人而言,我会像其他人一样使用
或者您可以详细说明并提前卸载值(我不建议这样做):
这与.foregroundColor
无关。它与.tintColor
和setTitleTextAttributes
有关
此参数的类型为[NSAttributedString.Key:Any]
。它不会以任何方式考虑每个密钥的文档。它不知道也不关心这应该是一个UIColor
。如果您传递了“squid”,那么它将在没有警告的情况下编译(它不会工作,但会编译):
它所看到的只是将view.tintColor
赋值给Any
类型的值
问题是view.tintColor
不是UIColor
,而是UIColor代码>。实际上,.tintColor
不可能为零,但可以将其设置为零:
UIBarButtonItem.appearance().setTitleTextAttributes(
[
.font: UIFont.systemFont(ofSize: 40),
.foregroundColor: "squid",
], for: .normal)
这在ObjC中是有意义的,但用Swift表达它的唯一方法是使用代码>类型。当您分配时代码>类型到其他事物,它们变成?
类型。这意味着您在一个接受Any
(字典值)的地方使用UIColor?
使用可选的asAny
可能会很危险,因为它会造成很多奇怪的情况。例如,您不能通过任意路径往返可选路径;它被压缩为其基本类型:
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
在使用任何工具时,都会有很多这样的小锐边
你当然不想和任何人一起工作。这不是你的错。但这就是斯威夫特抱怨的原因
根据您的喜好,有几种解决方案。您可以使用代码>:
let x: Any = Optional(1)
x as? Int? // Cannot downcast from 'Any' to a more optional type 'Int?'
x as? Int // 1
您可以添加作为任何
,以使警告静音:
.foregroundColor: view.tintColor!
就我个人而言,我会像其他人一样使用
或者您可以详细说明并提前卸载值(我不建议这样做):
setTitleTextAttributes
需要一个字典[NSAttributedString.Key:Any]
一切都可以被视为Any
和,这就是为什么在任何其他情况下都不会出现此警告的原因。它唯一出现的时间是使用Optional
执行此操作时。编译器只是想让您确保您知道如何使用可选的:)
您问过为什么在Xcode 10.2和Swift 5中会出现这种情况吗?
对于以这种方式宣布的期权,它总是很有效:
let optionalNumber:Int?=5.
对于以这种方式宣布的期权,决不允许:
让隐式WrappedOptionalNumber:Int!=5.
看看你的例子:
view.tintColor
是
为什么它不适用于隐式展开的选项?因为在Swift 5之前,隐式包装
和可选
是两种不同的类型!正如我之前所写的:它总是适用于可选的(而不适用于隐式包装的
)
现在它们是相同的类型,但是隐式展开选项有特殊的@\u autounwrapped
机制来区分这两种类型
已开始在Swift 4.2中删除该类型:
这项建议旨在将IUO的采用限制在其适用的地方
实际上是必需的,并将Swift语言放在
完全从系统中删除隐式展开的选项
其他技术使它们变得不必要。它也完全
取消任何低于类型检查器级别的IUO概念
编译器,这将大大简化编译器
实施