Dynamically remove null value from swift dictionary using function

I have the following code for a dictionary

var dic : [String: AnyObject] = ["FirstName": "Anvar", "LastName": "Azizov", "Website": NSNull(),"About": NSNull()]

I am already deleting a key that has a null value using the code below

var keys = dic.keys.array.filter({dic[$0] is NSNull})
for key in keys {
  dic.removeValueForKey(key)
}

It works for a static dictionary, but I want to do it dynamically, I want to do it with a function, but whenever I pass the dictionary as an argument, it works like a let symbol, so it cannot delete the null key I am doing the code below for this

func nullKeyRemoval(dic : [String: AnyObject]) -> [String: AnyObject]{
        var keysToRemove = dic.keys.array.filter({dic[$0] is NSNull})
        for key in keysToRemove {
            dic.removeValueForKey(key)
        }
        return dic
}

tell me the solution for this

+5
source share
8 answers

Instead of using a global function (or method), why not make it a method Dictionaryusing an extension?

extension Dictionary {
    func nullKeyRemoval() -> Dictionary {
        var dict = self

        let keysToRemove = Array(dict.keys).filter { dict[$0] is NSNull }
        for key in keysToRemove {
            dict.removeValue(forKey: key)
        }

        return dict
    }
}

( String, AnyObject), :

var dic : [String: AnyObject] = ["FirstName": "Anvar", "LastName": "Azizov", "Website": NSNull(),"About": NSNull()]
let dicWithoutNulls = dic.nullKeyRemoval()
+12

Swift 3.0 / 3.1 . NSNull :

extension Dictionary {
    func nullKeyRemoval() -> [AnyHashable: Any] {
        var dict: [AnyHashable: Any] = self

        let keysToRemove = dict.keys.filter { dict[$0] is NSNull }
        let keysToCheck = dict.keys.filter({ dict[$0] is Dictionary })
        for key in keysToRemove {
            dict.removeValue(forKey: key)
        }
        for key in keysToCheck {
            if let valueDict = dict[key] as? [AnyHashable: Any] {
                dict.updateValue(valueDict.nullKeyRemoval(), forKey: key)
            }
        }
        return dict
    }
}
+3

Swift 3:

 func removeNSNull(from dict: [String: Any]) -> [String: Any] {
    var mutableDict = dict
    let keysWithEmptString = dict.filter { $0.1 is NSNull }.map { $0.0 }
    for key in keysWithEmptString {
        mutableDict[key] = ""
    }
    return mutableDict
}

:

let outputDict = removeNSNull(from: ["name": "Foo", "address": NSNull(), "id": "12"])

: ["name": "Foo", "address": "", "id": "12"]

+1

Swift 4

, . O(n).

extension Dictionary where Key == String, Value == Any? {

    var trimmingNullValues: [String: Any] {
        var copy = self
        forEach { (key, value) in
            if value == nil {
                copy.removeValue(forKey: key)
            }
        }
        return copy as [Key: ImplicitlyUnwrappedOptional<Value>]
    }
}

Usage: ["ok": nil, "now": "k", "foo": nil].trimmingNullValues // = ["now": "k"]

, :

extension Dictionary where Key == String, Value == Any? {
    mutating func trimNullValues() {
        forEach { (key, value) in
            if value == nil {
                removeValue(forKey: key)
            }
        }            
    }
}

Usage: var dict: [String: Any?] = ["ok": nil, "now": "k", "foo": nil] dict.trimNullValues() // dict now: = ["now": "k"]

+1

, 1

extension Dictionary {
    func filterNil() -> Dictionary {
        return self.filter { !($0.value is NSNull) }
    }
}
+1

Swift 5 compactMapValues(_:),

let filteredDict = dict.compactMapValues { $0 is NSNull ? nil : $0 }
+1

, ( ), , ?

   extension NSDictionary
    {
        func RemoveNullValueFromDic()-> NSDictionary
        {
            let mutableDictionary:NSMutableDictionary = NSMutableDictionary(dictionary: self)
            for key in mutableDictionary.allKeys
            {
                if("\(mutableDictionary.objectForKey("\(key)")!)" == "<null>")
                {
                    mutableDictionary.setValue("", forKey: key as! String)
                }
                else if(mutableDictionary.objectForKey("\(key)")!.isKindOfClass(NSNull))
                {
                    mutableDictionary.setValue("", forKey: key as! String)
                }
                else if(mutableDictionary.objectForKey("\(key)")!.isKindOfClass(NSDictionary))
                {
                    mutableDictionary.setValue(mutableDictionary.objectForKey("\(key)")!.RemoveNullValueFromDic(), forKey: key as! String)
                }
            }
            return mutableDictionary
        }
    }
0
source

Swift 4 example using a shortcut

let dictionary = [
  "Value": "Value",
  "Nil": nil
]

dictionary.reduce([String: String]()) { (dict, item) in

  guard let value = item.value else {
    return dict
  }

  var dict = dict
  dict[item.key] = value
  return dict
}
0
source

Source: https://habr.com/ru/post/1599826/


All Articles