Key의 배열과 Dictionary를 비교하여 Dictionary에 배열되지 않은 값을 삭제합니다

16385 단어 Swift
제목이 길고 이해하기 어렵다

그러니까 뭘 하고 싶으세요?


여기에 스트링의 배열이 있다.
let keys = ["A", "B", "C", "D"]
Dictionary도 있습니다.
var dictionary = ["A": 0, "B": 1, "C": 2, "D": 3, "E": 4]
이에 비해 "E" 이 키는 keys에 없다dictionary.
"E"를 삭제하고 싶습니다.

임의의 것을 얻다

dictionary의 키를 얻어 keys에 포함되었는지 확인합니다.keys에서만 정렬 가능
let keys = ["A", "B", "C", "D"]
var dictionary = ["A": 0, "B": 1, "C": 2, "D": 3, "E": 4]
let contains = dictionary.keys.filter { (key) -> Bool in
    keys.contains(key)
}
print(contains) // ["B", "A", "C", "D"]

Dictionary만 있는 걸 얻었어요.


아까의 판단을 거꾸로 하면 된다.dictionary에서만 정렬 가능
let nocontains = dictionary.keys.filter { (key) -> Bool in
    !keys.contains(key) // !をつける
}
print(nocontains) // ["E"]

Dictionary에만 있는 것 삭제


이후에는 dictionary에서만 제거됩니다.
nocontains.forEach { (removeKey) in
    dictionary.removeValue(forKey: removeKey)
}
print(dictionary) // ["B": 1, "A": 0, "C": 2, "D": 3]

확장 Dictionary


그리고 삭제keys에 포함된 함수도 생성합니다
extension Dictionary {

    // 引数の配列に含まれていないものを削除
    // mutating func removeUnincludedValue(in keys: Array<Key>) {
    //  self.keys.filter { (key) -> Bool in
    //      !keys.contains(key)
    //      }.forEach { (removeKey) in
    //          self.removeValue(forKey: removeKey)
    //  }
    // }

    // 追記: コメント欄で教えてもらった
    func removeUnincludedValue(in keys: Array<Key>) -> Dictionary<Key, Value> {
        return self.filter { keys.contains($0.key) }
    }

    // 追記: コメント欄で教えてもらった
    func filtered(byKeys keys: Array<Key>) -> Dictionary {

        var newDictionary: Dictionary = [:]
        var keysIterator = keys.makeIterator()

        newDictionary.reserveCapacity(self.count)

        while let key = keysIterator.next() {
            if let value = self[key] {
                newDictionary[key] = value
            }
        }

        return newDictionary

    }

    // 追記: コメント欄で教えてもらった
    mutating func filter(byKeys keys: [Key]) {

        self = self.filtered(byKeys: keys)

    }

    // 追記: コメント欄で教えてもらった
    // func filtered(keys: [Key]) -> Dictionary {
    //  return keys.reduce(into: [Key: Value]()) { dict, key in dict[key] = self[key] }
    // }

    // 追記: コメント欄で教えてもらったのを、swiftっぽく書いてみた
    func filtered(keys: [Key]) -> Dictionary {
        return keys.reduce(into: [Key: Value]()) { $0[$1] = self[$1] }
    }



    // 引数の配列に含まれているものを削除
    // mutating func removeIncludedValue(in keys: Array<Key>) {
    //  self.keys.filter { (key) -> Bool in
    //      keys.contains(key)
    //  }.forEach { (removeKey) in
    //      self.removeValue(forKey: removeKey)
    //  }
    // }

    // 追記: もっと簡単に書けた
    mutating func removeIncludedValue(in keys: Array<Key>) {
        keys.forEach { (removeKey) in
            self.removeValue(forKey: removeKey)
        }
    }
}

키스에 포함되지 않지만 디렉터리에 포함된 내용을 삭제합니다

let keys = ["A", "B", "C", "D"]
var dictionary = ["A": 0, "B": 1, "C": 2, "D": 3, "E": 4]
dictionary.removeUnincludedValue(in: keys) // ["B": 1, "A": 0, "C": 2, "D": 3]

키스에 포함된 디렉터리에 포함된 내용 삭제

let keys = ["A", "B", "C", "D"]
var dictionary = ["A": 0, "B": 1, "C": 2, "D": 3, "E": 4]
dictionary.removeIncludedValue(in: keys) // ["E": 4]

유형에 따라 컴파일 오류가 발생할 수 있으므로 안심하십시오

let keys = ["A", "B", "C", "D"]
var dictionary1 = [0: 0, 1: 1, 2: 2]
dictionary1.removeUnincludedValue(in: keys)
// cannot convert value of type '[String]' to expected argument type 'Array<Int>'
"dictionary1의 키는 Int이므로 keys Int의 순서대로 배열해 주세요."

최후


나는 갑자기 생각해 보았는데, 해 보니 매우 간단하다.
만약 무슨 잘못이 있으면 저에게 알려주세요. 좀 더 간단하게 할 수 있을까요?
그리고 함수의 명칭에 대한 불안감

좋은 웹페이지 즐겨찾기