[swift] Swift 사전에 키가 포함되어 있는지 확인하고 해당 값을 가져 오는 경우

현재 비어 있지 않은 Swift 사전에 주어진 키가 포함되어 있는지 확인하고 동일한 사전에서 하나의 값을 얻기 위해 다음과 같은 (서투른) 코드 조각을 사용하고 있습니다.

어떻게 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
}



답변

당신은 필요하지 않습니다 어떤 이 사전에 이미 무엇 때문에이 작업을 수행하는 특수 코드를. 당신이 가져올 때 dict[key]당신이 알고 하지 않습니다 다시 얻을 수있는 옵션 때문에, 사전에 키가 포함되어 있는지 여부를 nil(그리고 값을 포함).

당신이 경우에 따라서, 단지 사전이 키가 포함되어 있는지 여부를 질문에 대답 할 질문 :

let keyExists = dict[key] != nil

값을 원하고 사전에 키가 포함되어 있다는 것을 알고 있다면 다음과 같이 말합니다.

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
}


답변

왜 간단히 확인하지 dict.keys.contains(key)않습니까? dict[key] != nil값이 nil 인 경우 검사 가 작동하지 않습니다. [String: String?]예를 들어 사전과 마찬가지로 .


답변

let keyExists = dict[key] != nil사전에 키가 있지만 값이 nil 인 경우 허용되는 답변 이 작동하지 않습니다.

사전에 키가 전혀 포함되어 있지 않은지 확인하려면 이것을 사용하십시오 (Swift 4에서 테스트).

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


답변

@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”}

실제로 첫 번째 값으로 얻을 수있는 것을 보장하지는 않으며이 경우에는 빨간색으로 반환됩니다.


답변

if dictionayTemp["quantity"] != nil
    {

  //write your code
    }


답변

선택적 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


답변

Swift 3에서 나를 위해 작동하는 것은 다음과 같습니다.

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