Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift ';强迫任何';但属性的类型为UIColor_Swift_Xcode_Optional - Fatal编程技术网

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 5Xcode 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?

使用可选的as
Any
可能会很危险,因为它会造成很多奇怪的情况。例如,您不能通过任意路径往返可选路径;它被压缩为其基本类型:

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?

使用可选的as
Any
可能会很危险,因为它会造成很多奇怪的情况。例如,您不能通过任意路径往返可选路径;它被压缩为其基本类型:

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概念 编译器,这将大大简化编译器 实施