 }
 
 
-// MARK: - extension ThemeSwitchData for convieniece usee
+// MARK: - extension ThemeSwitchData for convieniece usage
 extension ThemeSwitchData {
     func data<T>() -> T? {
         if let d = extData as? ThemeDataWraper<T> {

        // before process
        before()
        
        // call switch theme callback
        callback?.switchTheme(now: data.extData, pre: preData?.extData)
        
        // call switch theme method
        worker(now: data, pre: preData)
        
        // call switch theme block
        refreshBlock?(data.extData, preData?.extData)
        
        // after process
        after()
    }
    
    /// theme switch process
    ///
    /// - Parameters:
    ///   - now: cur theme data for switch
    ///   - pre: pre theme data
    func worker(now: ThemeSwitchData, pre: ThemeSwitchData?) {
        guard conf.recursion else {
            return
        }
        
        if conf.passConf {
            for child in childrens {
                child.conf = conf
                child.workerWrapper(data: now)
            }
        } else {
            for child in childrens {
                child.workerWrapper(data: now)
            }
        }
    }
}


 - returns: true switch theme will happen, or false ignore switch theme
 */
public typealias SwitchThemeBlock = ((_ now: Any, _ pre: Any?) -> Void)

open class CHObjectWrapper<T> {
    var value :T?
    init(value:T?) {
