如何从匹配的字典值中返回一个字符串?

时间:2019-08-30 11:10:01

标签: swift dictionary

我正在尝试从字典中返回一串选定值。当我遍历字典和要从中获取键的数组时,可以打印出值,但可以打印为不同的字符串,而不是组合在一起。

到目前为止,我已经遍历了集合类型,并尝试了映射,过滤和缩小。还尝试将结果放入数组和字典中以使用.joined,但我一直都无用。

这是我从中获取值的字典:

let letterDict = ["a": "1", "b": "2", "c": "3", "d": "4"]

这是我要查询的数组:

let characterArray = ["a", "b"]

这是我能够从中获取结果的代码:

func convertText(_ input: String) -> String {
    var expectedText: String?

    for character in characterArray {
        for (key, value) in letterDict {
            if key.contains(character) {
                print(value)
                expectedText = value
            }
        }
    }
    return expectedText ?? input
}

我正试图返回12,但得到的是:

1
2
一直

。即使我尝试将它们映射到数组,它也只会返回单独的数组(或字典)。当我尝试追加到数组时,它只会返回nil。

谢谢。

2 个答案:

答案 0 :(得分:1)

您需要将value附加到expectedText而不是分配它。

func convertText(_ input: String) -> String {
    var expectedText = ""

    for character in characterArray {
        for (key, value) in letterDict {
            if key.contains(character) {
                expectedText += value
            }
        }
    }
    return expectedText.isEmpty ? input : expectedText
}

答案 1 :(得分:1)

这是使用compactMap[Character : Character]字典的另一种方式:

let letterDict: [Character : Character] = ["a": "1", "b": "2", "c": "3", "d": "4"]

let str = "ab"
var newstr = String(str.compactMap { letterDict[$0] })
print(newstr) // 12

如果没有匹配的字符,它将返回空字符串"",而您的代码返回了原始字符串。如果这是理想的结果,则可以执行以下操作:

newstr = newstr.isEmpty ? str : newstr

因此您的功能变为:

func convertText(_ input: String) -> String {
    let expectedText = String(input.compactMap { letterDict[$0] })
    return expectedText.isEmpty ? input : expectedText
}

print(convertText("ab")) // 12
print(convertText("ef")) // ef