web-dev-qa-db-ja.com

Swift辞書にキーが含まれているかどうかを判断し、その値を取得する

私は現在、(空でない)Swift辞書に与えられたキーが含まれているかどうかを判断し、同じ辞書から1つ(任意の)値を取得するために、以下の(不器用な)コードを使用しています。

どのようにしてこれをSwiftでよりエレガントにすることができますか?

// excerpt from method that determines if dict contains key
if let _ = dict[key] {
    return true
}
else {
    return false
}

// excerpt from method that obtains first value from dict
for (_, value) in dict {
    return value
}
220
Drux

これを行うために any 特別なコードは必要ありません。なぜならそれはすでに辞書がしていることだからです。 dict[key] you know を取得すると、辞書にキーが含まれているかどうかがわかります。これは、返されるOptionalがnilではないためです(そしてそれには値が含まれます)。

ですから、もしあなたが just が辞書にキーが含まれているかどうかという質問に答えたいのなら、尋ねてください。

let keyExists = dict[key] != nil

値が欲しいのに know という辞書にキーが含まれているとします。

let val = dict[key]!

しかし、通常のように、それがキーを含んでいるのかわからない場合 - それを取得して使用したいが、存在する場合に限り - if letのようなものを使用します。

if let val = dict[key] {
    // now val is not nil and the Optional has been unwrapped, so use it
}
407
matt

単にdict.keys.contains(key)をチェックしないのはなぜですか?値がnilの場合、dict[key] != nilのチェックは機能しません。例えば辞書[String: String?]と同じです。

41

受け入れられた答えlet keyExists = dict[key] != nilは、辞書にキーが含まれているが値がnilである場合には機能しません。

辞書にキーがまったく含まれていないことを確認したい場合は、これを使用してください(Swift 4でテスト済み)。

if dict.keys.contains(key) {
  // contains key
} else { 
  // does not contain key
}
21
bergy

@mattから必要なものを取得したように見えますが、キーの値を取得する簡単な方法が必要な場合、またはそのキーが存在しない場合は最初の値だけを取得する場合は、

extension Dictionary {
    func keyedOrFirstValue(key: Key) -> Value? {
        // if key not found, replace the nil with 
        // the first element of the values collection
        return self[key] ?? first(self.values)
        // note, this is still an optional (because the
        // dictionary could be empty)
    }
}

let d = ["one":"red", "two":"blue"]

d.keyedOrFirstValue("one")  // {Some "red"}
d.keyedOrFirstValue("two")  // {Some "blue"}
d.keyedOrFirstValue("three")  // {Some "red”}

注意してください、あなたが実際に最初の値として得るものを保証するものではありません、それは単に「赤」を返すために起こります。

5
if dictionayTemp["quantity"] != nil
    {

  //write your code
    }
2
Paresh Hirpara

これは私にとってSwift 3でうまくいくものです。

let _ = (dict[key].map { $0 as? String } ?? "")
0
ΩlostA

オプションのNSAttributedStringを格納するキャッシュ実装のための私のソリューション:

public static var attributedMessageTextCache    = [String: NSAttributedString?]()

    if attributedMessageTextCache.index(forKey: "key") != nil
    {
        if let attributedMessageText = TextChatCache.attributedMessageTextCache["key"]
        {
            return attributedMessageText
        }
        return nil
    }

    TextChatCache.attributedMessageTextCache["key"] = .some(.none)
    return nil
0
Rishi