 
 import Foundation
 
-/// Enumerates the Local (NSUserDefaults) and Remote (NSUNSUbiquitousKeyValueStore) data stores
+/// Enumerates the Local (`UserDefaults`) and Remote (`NSUNSUbiquitousKeyValueStore`) data stores
 private enum ZephyrDataStore {
     case local  // UserDefaults
     case remote // NSUbiquitousKeyValueStore
 }
 
 @objcMembers
-public class Zephyr: NSObject {
+public final class Zephyr: NSObject {
     /// A debug flag.
     ///
     /// If **true**, then this will enable console log statements.


// MARK: - Observers (Objective-C)

@objc extension Zephyr {

    /// Observation method for UIApplicationWillEnterForegroundNotification
    func willEnterForeground(notification: Notification) {
        NSUbiquitousKeyValueStore.default.synchronize()
    }

    ///  Observation method for NSUbiquitousKeyValueStoreDidChangeExternallyNotification
    func keysDidChangeOnCloud(notification: Notification) {
        if notification.name == NSUbiquitousKeyValueStore.didChangeExternallyNotification {
            guard let userInfo = (notification as NSNotification).userInfo,


    /// Zephyr's synchronization method.
    ///
    /// Zephyr will synchronize all `UserDefaults` with `NSUbiquitousKeyValueStore`.
    ///
    /// If one or more keys are passed, only those keys will be synchronized.
    ///
    /// - Parameters:
    ///     - keys: If you pass a one or more keys, only those key will be synchronized. If no keys are passed, than all `UserDefaults` will be synchronized with `NSUbiquitousKeyValueStore`.
    public static func sync(keys: String...) {

        if !keys.isEmpty {
