プログラマ英語日記

プログラミング学習のまとめなど

WWDC Cocoa Development Tips まとめ

Cocoa Development Tips

  • 「あなたが知らないCocoaの29のこと」という面白そうな副題がついてたので見てみました。

  • Internationalization

    • Xcode Scheme Editor > Options から言語を設定できる
  • UserDefaults

    • 4つの階層がある
      • Argument Domain / Application Domain / Global Domain / Registration Domain
      • 読み込み時は、先頭から順に問い合わせる
      • 書き込み時はそれぞれの階層で手法が異なる
        • Registration Domain > UserDefaults.standard.register([“key” : value])
        • ↑これは永続化されない
        • Global Domain > defaults write GlobalDomain key -bool value
        • コマンドラインから叩く。コードではない
        • Application Domain > UserDefaults.standard.set(key, value)
        • ↑よく使うもの
        • Argument Domain > 起動時に設定。書き込みはない
  • 役立つUserDefaults

    • -NSViewLayoutFeedbackLoopDebug YES
      • 繰り返し発生しているレイアウトを追跡しやすくなる
    • -NSApplicationCrashOnException YES
      • クラッシュ時の例外をキャッチして表示してくれる
  • UserDefaults + KVO

    • UserDefaultsはKVOで監視できる
//新機能
extension UserDefaulst {
  @objc dynamic var showAtLaunch : Bool {
    return self.value(forKey: "showAtLaunch") as? Bool ?? false
  }
}

let observation = UserDefaults.standard.observe(\.showAtLaunch) { observed, change in 
  //処理
}

  • Base64

    • Data(base64Encoding:) で楽にBase64文字列を変換できる
    • data.base64EncodedStringBase64文字列化可能
  • Asset Catalogs

    • 画像でも LayoutDirection がサポートされている(去年から?)
      • LayoutDirectionごとに画像を出し分けることができる
    • 色域(Gamut)もサポート。sRGBとP3で画像の出し分けが可能
    • iOS11(HighSierra)からは Color もサポート
      • Androidの colors.xml のイメージ
      • 定義した色を Xib で使える他、 UIColor.init?(named:) で取得可能
  • Unit Test

    • XcodeのNewFileからUnitTestを選択することでテンプレートが生成される
  • NSBox

    • NSBoxを拡張して角丸にする
    • boxTypeをseparatorにして区切り線にするなど
    • Mac専用APIなので正直よくわからず…
  • Restorable State

    • こちらもMacOS専用
    • NSResponderに状態を保持させ、再起動で復元させる?
    • restorableStateKeyPathsプロパティを使えば楽になる?
  • CoreData

    • ※もはやRealmの時代だとは思いますが
    • NSPersistentContainerを使えば厄介なCoreData初期化で楽できる
    • 配列を保存したいときは、RelationShip で ToMany を選択する
      • 必要に応じorderedにもチェックをいれる
    • Modelの新バージョンを作り、あとはCoreData側がマイグレーションしてくれる
    • エラーは適切にハンドリングする
      • 特に追加時
  • NSError

    • NSErrorには各種メッセージがあるので、適切にユーザに表示する
    • 自分でエラーを発生させるときも適切にメッセージを設定するように
    • CocoaErrorを使えば楽できる(新規)
    • 専用のドメインを作えばハンドルしやすくなる?
  • SharedKeySets

    • 頻出するキーを渡しておけば高速化できる
    • NSDictionary.sharedKeySet と NSMutableDicitonary.init(sharedKeySet:) をペアで使う
let set = NSDictionary.sharedKeySet(forKeys:["id", "name"])
let dict = NSMutableDictionary(sharedKeySet: set)
dict["id"] = ...
dict["name"] = ...
  • Accessibility

    • VoiceOverはIBから簡単に設定できる
    • Appを1024x640でテストしておく
    • DeveloperToolのAccessibilityInspectorをうまく使う
  • Documents

    • ユーザに保存させる文章にNSDocumentを使えばVersionControlなどいいようにやってくれる?
    • CocoaAPIは使ったことがないのでイマイチつかめず
  • Reporting Exceptions

    • NSApplication reportExceptionをオーバーライドすれば例外をロギングしやすくなる
  • Debugging

    • XcodeのDebug領域をうまく使う
    • View hierarchy, Debug memory graph, simulate location
  • Sound

    • NSButtonにSoundを設定できる

※セッション一覧ページにはiOS/Mac/watchOS/tvOSとあったのですが、思ったよりMacでした。CocoaTipsなので当然かもしれませんが。