         super.init()
 
         // Login
-        bind(propertyKeyPath: \.cachedUsername, to: .cachedUsername)
         bind(propertyKeyPath: \.currentUsername, to: .currentUsername)
 
         // Settings


class Settings: NSObject {
    let defaults: UserDefaults

    // Note: Initial value of MutablePropery will be overwrited by value in UserDefaults while binding.

    // Login
    let cachedUsername: MutableProperty<String?> = MutableProperty(nil)
    let currentUsername: MutableProperty<String?> = MutableProperty(nil)

    // Settings

        let keyPath = "\(key.keyString)"
        S1LogDebug("Register KVO keypath: \(keyPath)")
        defaults.addObserver(self, forKeyPath: keyPath, options: [.new], context: nil)
        observingKeyPaths[keyPath] = { (newValue) in
            if newValue is NSNull {
                property.setValueIfDifferent(.none)
            } else if let newValue = newValue as? T {
                property.setValueIfDifferent(.some(newValue))
            } else {
                S1LogError("Expect newValue \(newValue) has Type \(T.self) or NSNull but got \(type(of: newValue))")
                property.setValueIfDifferent(.none)
            }
        }
    }

    // swiftlint:disable block_based_kvo
    @objc override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
        guard let keyPath = keyPath else {
            fatalError("keyPath should not be nil.")
        }

        guard let newValue = change?[.newKey] else {
            fatalError("changes[.newKey] should not be nil.")
        }

        guard let callback = observingKeyPaths[keyPath] else {
            fatalError("observingKeyPaths should have information about \(keyPath)")
        }

        callback(newValue)
    }
}
