Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 462 - Navigation Controllers and Table Views 4

Swiftで遊ぼう!の古い記事-> Life-LOG OtherSide

Beginning iPhone Development with Swift: Exploring the iOS SDK

Beginning iPhone Development with Swift: Exploring the iOS SDK

FavoritesListのシングルトン・パターン実装が全くできていませんね(^^;)

前回までのコードをもう一度ここに取りあげます。計算型プロパティではなくクラス・プロパティの「let」のバージョンです。

import Foundation
import UIKit

class FavoritesList {

 static let sharedFavoriteList: FavoritesList = FavoritesList()

 private(set) var favorites: [String] 
    
 private init() {
  let defaults = NSUserDefaults.standardUserDefaults()
  guard let storedFavorites = defaults.objectForKey("favorites") as? [String] else {
   favorites = []
   return
  }
  favorites = storedFavorites
 }
 // コードは続く
}

セッターがprivate設定されている変数favoritesを操作するメソッドを用意しなければなりません。アイテムを加えたり消したりセーブするメソッドを用意します。

// Beginning iPhone Development with Swift: Exploring the iOS SDK
// Swift 1.0スタイル

func addFavorite(fontName: String) {
 if (!contains(favorites, fontName)) {
  favorites.append(fontName)
  saveFavorites()
 }
}

func removeFavorite(fontName: String) {
 if let index = find(favorites, fontName) {
  favorites.removeAtIndex(index)
  saveFavorites()
 }
}

private func saveFavorites() {
 let defaults = NSUserDefaults.standardUserDefaults()
 defaults.setObject(favorites, forKey: "favorites")
 defaults.synchronize()
}

このオリジナルのコードをXcode7に入力してもエラーだらけになります。Swift対応と言っても、Swift 1.0なんで話になりません。これを私なりにSwift 2.0に変更したのが次のコードです。

// Swift 2.0スタイル

func addFavorite(fontName: String) {
 guard favorites.contains(fontName) else {
  favorites.append(fontName)
  saveFavorites()
  return
 }
}
    
func removeFavorite(fontName: String) {
 if let index = favorites.indexOf(fontName) {
  favorites.removeAtIndex(index)
  saveFavorites()
 }
}
    
private func saveFavorites() {
 let defaults = NSUserDefaults.standardUserDefaults()
 defaults.setObject(favorites, forKey: "favorites")
 defaults.synchronize()
}

まずArrayの扱い、特にアレーで扱えるメソッドが変わりました。このメソッドの変化を知ることも重要なんですが、それよりSwift 2.0で使えるようになった「guard else」の自然な流れのコーディングに感銘を受けました。

実はコンディションを評価する次のような書き方

 if (!contains(favorites, fontName)) {
 // コーディング
}

この「!」を使う条件判定、「否定」の「否定」を「true」とする不自然な流れになかなか慣れることができなかったけど上記のように「guard」を使うことで、否定を直接「true」として扱う書き方がシックリきます。素晴らしいです!

そして、アレーのメソッド、iOS9から完全に「find」は消えました。というか新しく使用できる「indexOf」もiOS7から使用できてることを知って唖然! どうしてこの本は古いメソッドでコーディングしているんでしょう。こういう付け焼き刃的なSwift対応本っていうのはどうでしょうね...

もう少しコーディングスタイルをiOS8(今からならiOS9)に向けて変更して貰いたいですね。

今日はここまで。