【问题标题】:Swift Dictionary<String, Any> getting optional valuesSwift Dictionary<String, Any> 获取可选值
【发布时间】:2020-03-07 14:32:42
【问题描述】:

自从我在 macOS 上做任何工作已经有几年了,自从我接触 Swift 以来已经有两年多了。我在这个圈子里跑来跑去:

我有两个函数,第一个包含一个 while 循环来检查第二个返回的字典中的值。 :

func checkPath(_ strPath:String) { 

...
while bIsDesktop == false {
    let dictResults:Dictionary<String, Any> = checkPath(arrPath)

    if dictResults["isDesktop"] { //-->I'm getting crushed here
        //do something with returned array
    }

}

private func checkPath(_ arrPath:Array<String>) -> Dictionary<String, Any> {
    var bIsDesktop = false
    var arrPath = arrPath
    if arrPath[0] != "Desktop" {
       arrPath.removeFirst()
    } else {
       bIsDesktop = true
    }

    return ["paths":arrPath, "isDesktop":bIsDesktop]
}

arrPath 是一个字符串数组(文件路径项)

我知道返回的字典是这样的 [String:Any]

问题是无论我做什么都会遇到某种编译器错误,例如:

Optional type 'Any?' cannot be used as a boolean; test for '!= nil' instead

在更宏大的计划中,如果有更优雅的解决方案,我要做的是剥离 ///File:User/username/Desktop/.. 的用户选择的文件夹的路径。 . 并且只有桌面/... .

我试过了:

guard let bIsDesktop = dictResults["isDesktop" as Bool else { ...
if dictResults?["isDesktop"]...

和其他各种排列。我得到 nil 或编译器错误。

【问题讨论】:

  • 查找“条件绑定”。更一般地,阅读 Swift 语言指南,从头到尾。 docs.swift.org/swift-book/LanguageGuide/TheBasics.html
  • 老实说,仅通过阅读您的代码,我不知道您要做什么。所以你想删除Desktop之前的所有内容?如果路径没有Desktop怎么办?
  • 您不应该使用String 路径来处理文件。请改用URLs,它具有辅助属性/方法,例如lastPathComponent,可以为您的目标派上用场。
  • @DávidPásztor 更好地获取 URL 资源值(本地化名称)stackoverflow.com/questions/28570627/…

标签: swift macos optional


【解决方案1】:

我确实认为您遇到了一个复杂的错误,而且我没有测试您的整个故事。对此我深表歉意,并仍在尝试将此作为解决方案发布。

据我所知,您正在尝试使用以下语句查看变量是否为真:

if dictResults["isDesktop"] { //-->I'm getting crushed here
        //do something with returned array
    }

问题是您知道或暗示 dictResult["isDesktop"] 处的字典条目是布尔值。但是,您的编译器不知道,因为您向它提供了它可以是“Any”类型的知识。

这不适合编译器,因为它无法确定“Any”类型是真还是假。

据我了解,您首先必须将 dictResult["isDesktop"] 转换为布尔值,然后才能要求编译器将其评估为真或假。如果您不将其转换为布尔值,则必须将其视为非布尔类型并在 if 语句中告诉编译器将其评估为您想要的值。

编译器错误基本上是在告诉你:“我不知道 Any? 是什么类型,但我知道它可以是某个值,也可以没有。如果你输入一个语句“if (type),我假设你想要我评估这个可选值是否有价值。这不是您想要的,您想告诉编译器它需要将该语句评估为布尔值。

我认为两者都应该工作:

if let result = dictResults["isDesktop"] as? bool {

}

if (dictResults["isDesktop"] as bool) {

}

再一次,我还没有测试过,很抱歉。我确实认为这是解决这个问题的方法。

亲切的问候, Mac用户T

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多