iOS
Swift
bukuroswift
cocoastudy
More than 1 year has passed since last update.

Traditional version of MVC as a compound pattern

MVC.png

Cocoa version of MVC as a compound design pattern

Cocoa.png

NS.png


  • iOS 5 からUIDocumentクラスが用意されたが、少々、オーバースペック。

  • 筆者は、以前から、独自のDocumentクラスを用意していた。

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

Document.png

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練習帳