如何通过Swift中的函数传递字典键以返回作为数组的值

时间:2019-01-09 05:39:21

标签: swift dictionary optional

我的任务是编写只有几个条目的基本“同义词库”应用程序,但是我不知道如何编写可以通过函数传递的键具有nil值时返回结果的代码

最终,该想法是将文本字段输入连接到文本视图输出,以便用户可以输入任何单词来尝试获得响应。但是,如果不将代码连接到用户界面,我什至无法拨入代码。

let synonyms = ["swift" : ["abrupt", "expeditious", "hasty", "nimble", "quick", "rapid", "speedy", "sudden", "unexpected"]]

func buttonPressed(key:String)-> Array<Any> {
        return synonyms[key]!
}

buttonPressed(key: "swift")

如果没有强制解包,我将无法运行该程序,但是我最终希望该函数能够为nil输入返回一个字符串,该字符串表示“我很抱歉-该词不在同义词库中。” < / p>

如果我使用“ if let”解开包装,我不知道应该是什么“ else”;而且我不知道在我的键在字典中有值的情况下如何返回数组,但是在无情况下返回字符串。

有什么建议吗?谢谢!

3 个答案:

答案 0 :(得分:1)

由于键可能不存在,因此字典始终返回可选值。认为您的字典是[String:[String]?]

您可以使用 nil合并运算符对其进行解包。 ?? operator in Swift

func buttonPressed(key:String)-> Array<Any> {
       return synonyms[key] ?? ["I'm sorry- this word is not in the Thesaurus."] 
}

答案 1 :(得分:1)

首先是逻辑。由于您的字典是[String:[String]],因此您需要返回String数组作为字符串 key

value
  `String` ˇ
synonyms[key] // returns synonyms
^ dictonary       ^ `[String]`

因此,您有一个想法:您拥有带有输入,按钮和文本视图的文本字段。首先,您需要在按下按钮时进行注册。因此,为事件.touchUpInside

创建操作
@IBAction func buttonPressed(_ sender: UIButton) {
}

因此,您可以通过获取其text属性来获取文本字段的文本。您可以对文本视图执行同样的操作。

textField.text 
textView.text

因此,现在按下按钮时,从文本字段获取输入,并且如果存在用于文本字段的文本的键,请将文本视图的文本更改为此键的值

@IBAction func buttonPressed(_ sender: UIButton) {
    if let synonyms = synonyms[textField.text!] {
        let text = array.joined(separator: ", ")
        textView.text = text
    }
}

您是否注意到这一行:

let text = array.joined(separator: ", ")

...由于数组的类型为textView,因此无法像设置数组一样设置[String]的文本,但是text属性只支持单个字符串。因此,这会将您的数组“连接”为单个String,并在数组中每个元素之间使用分隔符。

答案 2 :(得分:0)

希望这对您有所帮助。 要返回数组:

let synonyms = ["swift" : ["abrupt", "expeditious", "hasty", "nimble", "quick", "rapid", "speedy", "sudden", "unexpected"]]

    func search(key: String)-> [String] {
        //The default value should also be an array with one String element
        return synonyms[key] ?? ["I'm sorry- this word is not in the Thesaurus."] 
    }

    //This is the button action that will call the search(key:) method
    @IBAction buttonPressed(_ sender: UIButton) {
        let results = search(key: textField.text ?? "") //get the text from the UITextField
    }