独自Documentクラス


Traditional version of MVC as a compound pattern

Cocoa version of MVC as a compound design pattern

  • iOS 5 からUIDocumentクラスが用意されたが、少々、オーバースペック。
  • 筆者は、以前から、独自のDocumentクラスを用意していた。

Documentクラスはモデル・コントローラ

Documentクラスの例

class Document {
    var version: String

    private var _uniqueIdentifier: String
    var uniqueIdentifier: String {
        return _uniqueIdentifier
    }

    static let sharedInstance: Document = {
        let instance = Document()
        return instance
    }()

    init() {
        let infoDictionary = Bundle.main.infoDictionary! as Dictionary
        self.version = infoDictionary["CFBundleShortVersionString"]! as! String
        self._uniqueIdentifier = ""
    }

    deinit {
    }

    func load() {
        loadDefaults()
    }

    func save() {
        updateDefaults()
    }

    private func clearDefaults() {
        let userDefaults = UserDefaults.standard
        if userDefaults.object(forKey: "version") != nil {
            userDefaults.removeObject(forKey: "version")
        }
        if userDefaults.object(forKey: "uniqueIdentifier") != nil {
            userDefaults.removeObject(forKey: "uniqueIdentifier")
        }
    }

    private func updateDefaults() {
        let userDefaults = UserDefaults.standard

        var versionString: String = ""
        if userDefaults.object(forKey: "version") != nil {
            versionString = userDefaults.object(forKey: "version") as! String
        }
        if versionString.compare(self.version) != .orderedSame {
            userDefaults.setValue(self.version, forKey: "version")
            userDefaults.synchronize()
        }

        var uniqueIdentifier: String = ""
        if userDefaults.object(forKey: "uniqueIdentifier") != nil {
            uniqueIdentifier = userDefaults.object(forKey: "uniqueIdentifier") as! String
        }
        if uniqueIdentifier.compare(self.uniqueIdentifier) != .orderedSame {
            userDefaults.setValue(self.uniqueIdentifier, forKey: "uniqueIdentifier")
            userDefaults.synchronize()
        }
    }
   private func loadDefaults() {
        let userDefaults = UserDefaults.standard

        var versionString: String = ""
        if userDefaults.object(forKey: "version") != nil {
            versionString = userDefaults.object(forKey: "version") as! String
        }
        if versionString.compare(self.version) != .orderedSame {
            /* バージョン不一致対応 */
            clearDefaults()
            _uniqueIdentifier = UUID.init().uuidString
        }
        else {
            /* 読み出し */
            if userDefaults.object(forKey: "uniqueIdentifier") != nil {
                _uniqueIdentifier = userDefaults.object(forKey: "uniqueIdentifier") as! String
            }
        }
    }

    private func modelDir() -> String {
        let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        if paths.count < 1 {
            return ""
        }
        var path = paths[0]

        path = path.appending(".model")
        return path
    }

    private func modelPath() -> String {
        let path = modelDir().appending("/model.dat")
        return path;
    }
}

シングルトンを使わない例

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
   public let document = Document()
    :
}
let delegate = UIApplication.shared.delegate as! AppDelegate
let document = delegate.document
print(document)

【関連情報】
BUKURO.swift

Cocoa勉強会 関東

MOSA

Cocoa練習帳