         return false
     }
     // MARK: Getting Values
-    public func string(forKey keyName: String, defaultValue:String? = "") -> String? {
+    public func string(forKey keyName: String) -> String? {
+        let keychainData: Data? = self.getData(forKey: keyName)
+        var stringValue: String?
+        if let data = keychainData {
+            stringValue = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as String?
+            if let trimmedString = stringValue {
+                if trimmedString.trimmingCharacters(in: CharacterSet.whitespaces) as String! == "" {
+                    return nil
+                }
+            }
+            else {
+                return nil
+            }
+        }
+        else {
+            return nil
+        }
+        
+        return stringValue!
+    }
+    public func bool(forKey keyName: String) -> Bool? {
+        let keychainData: Data? = self.getData(forKey: keyName)
+        var boolValue: Bool?
+        if let data = keychainData {
+            boolValue = NSKeyedUnarchiver.unarchiveObject(with: data) as! Bool?
+        }
+        else {
+            return nil
+        }
+        
+        return boolValue
+    }
+    public func integer(forKey keyName: String) -> Int? {
+        let keychainData: Data? = self.getData(forKey: keyName)
+        var intValue: Int?
+        if let data = keychainData {
+            intValue = NSKeyedUnarchiver.unarchiveObject(with: data) as! Int?
+        }
+        else {
+            return nil
+        }
+        
+        return intValue
+    }
+    public func array(forKey keyName: String) -> Array<Any>? {
+        let keychainData: Data? = self.getData(forKey: keyName)
+        var arrayValue: Array<Any>?
+        if let data = keychainData {
+            arrayValue = NSKeyedUnarchiver.unarchiveObject(with: data) as! Array<Any>?
+        }
+        else {
+            return nil
+        }
+        
+        return arrayValue
+    }
+    public func object(forKey keyName: String) -> NSCoding? {
+        let dataValue: Data? = self.getData(forKey: keyName)
+        
+        var objectValue: NSCoding?
+        
+        if let data = dataValue {
+            objectValue = NSKeyedUnarchiver.unarchiveObject(with: data) as! NSCoding?
+        } else {
+            return nil
+        }
+        
+        return objectValue;
+    }
+    //Default value
+    public func string(forKey keyName: String, defaultValue:String) -> String {
         let keychainData: Data? = self.getData(forKey: keyName)
         var stringValue: String?
         if let data = keychainData {

        else {
            return defaultValue
        }
        
        return boolValue
    }
    public func integer(forKey keyName: String, defaultValue:Int? = 0) -> Int? {
        let keychainData: Data? = self.getData(forKey: keyName)
        var intValue: Int?
        if let data = keychainData {

        } else {
            return defaultValue
        }
        if let val = objectValue as NSCoding? {
            return val
        } else {
            return defaultValue
        }
    }
    //GET
    fileprivate func getData(forKey keyName: String) -> Data? {
        let keychainQueryDictionary = self.setupKeychainQueryDictionary(forKey: keyName)
        var result: AnyObject?
