         // Specify we want NSData/CFData returned
         keychainQueryDictionary[SecReturnData] = kCFBooleanTrue
 
-        // Use an unsafe mutable pointer to work around a known issue where data retrieval may fail
-        // for Swift optimized builds.
-        // See http://stackoverflow.com/a/27721235
-        var result: AnyObject?
-        let status = withUnsafeMutablePointer(&result) { SecItemCopyMatching(keychainQueryDictionary, UnsafeMutablePointer($0)) }
+        // Search
+        let status = withUnsafeMutablePointer(&result) {
+            SecItemCopyMatching(keychainQueryDictionary, UnsafeMutablePointer($0))
+        }
+
+        return status == noErr ? result as? NSData : nil
+    }
+
+    /// Save a String value to the keychain associated with a specified key. If a String value already exists for the given keyname, the string will be overwritten with the new value.
+    ///
+    /// :param: value The String value to save.
+    /// :param: forKey The key to save the String under.
+    /// :returns: True if the save was successful, false otherwise.
+    public class func setString(value: String, forKey keyName: String) -> Bool {
+        if let data = value.dataUsingEncoding(NSUTF8StringEncoding) {
+            return self.setData(data, forKey: keyName)
+        } else {
+            return false
+        }
+    }
+
+    /// Save an NSCoding compliant object to the keychain associated with a specified key. If an object already exists for the given keyname, the object will be overwritten with the new value.
+    ///
+    /// :param: value The NSCoding compliant object to save.
+    /// :param: forKey The key to save the object under.
+    /// :returns: True if the save was successful, false otherwise.
+    public class func setObject(value: NSCoding, forKey keyName: String) -> Bool {
+        let data = NSKeyedArchiver.archivedDataWithRootObject(value)
+
+        return self.setData(data, forKey: keyName)
+    }
+
+    /// Save a NSData object to the keychain associated with a specified key. If data already exists for the given keyname, the data will be overwritten with the new value.
+    ///
+    /// :param: value The NSData object to save.
+    /// :param: forKey The key to save the object under.
+    /// :returns: True if the save was successful, false otherwise.
+    public class func setData(value: NSData, forKey keyName: String) -> Bool {
+        var keychainQueryDictionary: [String:AnyObject] = self.setupKeychainQueryDictionaryForKey(keyName)
+
+        keychainQueryDictionary[SecValueData] = value
+
+        // Protect the keychain entry so it's only valid when the device is unlocked
+        keychainQueryDictionary[SecAttrAccessible] = kSecAttrAccessibleWhenUnlocked
+
+        let status: OSStatus = SecItemAdd(keychainQueryDictionary, nil)
+
         if status == errSecSuccess {
-            return result as NSData?
-        } else {
-            return nil
-        }
-    }
-
-    // MARK: Setting Values
-    public class func setString(value: String, forKey keyName: String, accessible: Accessible = .WhenUnlocked) -> Bool {
-        if let data = value.dataUsingEncoding(NSUTF8StringEncoding) {
-            return self.setData(data, forKey: keyName, accessible: accessible)
-        } else {
-            return false
-        }
-    }
-
-    public class func setObject(value: NSCoding, forKey keyName: String, accessible: Accessible = .WhenUnlocked) -> Bool {
-        let data = NSKeyedArchiver.archivedDataWithRootObject(value)
-
-        return self.setData(data, forKey: keyName, accessible: accessible)
-    }
-
-    public class func setData(value: NSData, forKey keyName: String, accessible: Accessible = .WhenUnlocked) -> Bool {
-        var keychainQueryDictionary: NSMutableDictionary = self.setupKeychainQueryDictionaryForKey(keyName)
-
-        keychainQueryDictionary[SecValueData] = value
-
-        // Protect the keychain entry as requested.
-        keychainQueryDictionary[SecAttrAccessible] = KeychainWrapper.accessible(accessible)
-
-        let status: OSStatus = SecItemAdd(keychainQueryDictionary, nil)
-
-        if status == errSecSuccess {
             return true
         } else if status == errSecDuplicateItem {
-            return self.updateData(value, forKey: keyName, accessible: accessible)
-        } else {
-            return false
-        }
-    }
-
-    // MARK: Removing Values
+            return self.updateData(value, forKey: keyName)
+        } else {
+            return false
+        }
+    }
+
+    /// Remove an object associated with a specified key.
+    ///
+    /// :param: keyName The key value to remove data for.
+    /// :returns: True if successful, false otherwise.
     public class func removeObjectForKey(keyName: String) -> Bool {
-        let keychainQueryDictionary: NSMutableDictionary = self.setupKeychainQueryDictionaryForKey(keyName)
+        let keychainQueryDictionary: [String:AnyObject] = self.setupKeychainQueryDictionaryForKey(keyName)
 
         // Delete
         let status: OSStatus =  SecItemDelete(keychainQueryDictionary);

        }
    }

    // MARK: Public Methods
    public class func hasValueForKey(key: String) -> Bool {
        var keychainData: NSData? = self.dataForKey(key)
        if let data = keychainData {
            return true
        } else {

        }
    }

    /// Setup the keychain query dictionary used to access the keychain on iOS for a specified key name. Takes into account the Service Name and Access Group if one is set.
    ///
    /// :param: keyName The key this query is for
    /// :returns: A dictionary with all the needed properties setup to access the keychain on iOS
    private class func setupKeychainQueryDictionaryForKey(keyName: String) -> [String:AnyObject] {
        // Setup dictionary to access keychain and specify we are using a generic password (rather than a certificate, internet password, etc)
        var keychainQueryDictionary: [String:AnyObject] = [SecClass:kSecClassGenericPassword]

        // Uniquely identify this keychain accessor
        keychainQueryDictionary[SecAttrService] = KeychainWrapper.serviceName

        // Set the keychain access group if defined
        if !KeychainWrapper.accessGroup.isEmpty {
            keychainQueryDictionary[SecAttrAccessGroup] = KeychainWrapper.accessGroup
        }

        // Uniquely identify the account who will be accessing the keychain
        var encodedIdentifier: NSData? = keyName.dataUsingEncoding(NSUTF8StringEncoding)

