快速字典 获取可选值

问题描述 投票:1回答:1

自从我在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 /的用户选择的文件夹。并拥有Desktop / ...如果有比我尝试的解决方案更好的解决方案,我将不胜感激,但是如果您也可以解释为什么我无法从词典中获取可选内容,我也将不胜感激。

我尝试过:

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

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

swift macos optional
1个回答
0
投票

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

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

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

问题是您知道,或暗示dictResult [“ isDesktop”]]上的字典条目是布尔值。但是,您的编译器不知道,因为您提供的编译器可以是“任何”类型。

这在编译器中不太合适,因为它无法确定“ Any”类型为true还是false。

据我了解,您首先必须将dictResult [“ isDesktop”]转换为布尔值,然后才能要求编译器将其评估为真还是假。如果不将其转换为布尔值,则必须将其视为无布尔值类型,并在if语句中告知编译器以将其评估为所需的值。

编译器错误基本上是在告诉您:“我不知道Any类型是什么?但是我知道它可以是一些值,也可以是无。如果您在语句中输入“ if(type),我认为您想要我评估此可选值是否具有值。这不是您想要的,您想告诉编译器它需要将该语句评估为bool。

我认为任何一个都应该起作用:

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

}

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

}

同样,我尚未测试,对不起。我确实认为这是解决此问题的方法。

亲切的问候,MacUserT

© www.soinside.com 2019 - 2024. All rights reserved.