プログラミングや電子工作などについての記事がほとんどです

Xcode8+Swift3でNSUserDefaultsが使えない

0 件のコメント

NSUserDefaultsが使えない

この間のSwiftやXcodeのバージョンアップによって従来の環境とはコードの書き方が変わってきたりしているようです。先日Qiitaに投稿したSegueに関する記述にも同様のことが言えそうです。

[iOS][Swift]prepareForSegueをOverride出来ない……の対処法 - Qiita

背景

私は現在本気ではじめるiPhoneアプリ作りという書籍を読み進めながらiOSアプリの開発を勉強しています。この本、2016年3月10日と比較的新しく、Amazonでも平均4以上のなかなか評判のいい本です。


しかしソフトウェア技術はナマモノなので、アップデートがあるとその対応は公式の情報を拾ったりネットの記事を読んだりするしかありません。誰かの役に立てばということでこの記事を執筆しました。

ちなみに、はやくも新しいバージョンに対応した書籍も出始めているようです。

Xcodeではじめる 簡単iPhoneアプリ開発[Xcode 8&Swift 3対応]
技術評論社 (2016-09-22)
売り上げランキング: 5,959

NSUserDefaultsとは

今回の題材となっているNSUserDefaultsですが、iOS端末にアプリのデフォルト設定などを保存したり呼び出したりするときに使うクラスです。上記書籍ではp208~の「5章:永続的なデータを扱う-ToDoリストアプリで学ぶデータ操作」という所に該当します。これが先日のXcodeとSwiftの大型アップデートによって使えなくなったようです。おかげでサンプルプログラムを入力してもインテリセンスでもクラスが出てくることはありません……。

なお、この書籍はXcode7系とSwift2系をサポートしていると明記してあるので、Xcode8やSwift3はサポート外であることに関してはこの書籍の責任はありません。仕方ないのです……。

対応策

公式リファレンスを見てどう対応すべきか探ってみることにしました。するとそれっぽい新しいクラスが見つかりました。

UserDefaults - Foundation | Apple Developer Documentation

このクラス、名前こそUserDefaultsですが、リファレンスの記述を呼んでみるとところどころUserDefaultsではなくNSUserDefaultsと書いているところからドキュメントがまだ新しくなっていないようですね。ですがメソッドはきちんとUserDefaultsのものになっており、使えるようでした。


このリファレンスを元に書き直してみたところ、思った通りの動作をしてくれました。データの更新についての記述を比較してみましょう。なおこのアプリはテキストフィールドの内容をボタンを押すことで保存し、次回以降アプリの起動時にテキストフィールドに表示するというものです。著作権保護のため元のコードをこちらで掲載することはできませんが、出版社の公式ページからダウンロードできます。Chapter5のSampleDataStorageというプロジェクトを御覧ください。

こちらに私が書き直したバージョンのソースを掲載します。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    @IBAction func tapActionButton(_ sender: AnyObject) {
        let userDefaults = UserDefaults.init()
        userDefaults.set(textField.text, forKey: "text")
        userDefaults.synchronize()
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let userDefaults = UserDefaults.init()

        if let value = userDefaults.string(forKey: "text"){
            textField.text = value
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

大きく違うところはクラスをNSUserDefaultsからUserDefaultsに変更したこと。またそれに伴って使うメソッドを変更しました。

  • NSUserDefaults.standardUserDefaults()UserDefaults.init()
  • NSUserDefaults.stringForKey(String)UserDefaults.string(forKey: String)
  • NSUserDefaults.setObject(String, forKey: String)UserDefaults.set(String, forKey: String)
という具合です。

もし他に正しい書き方があればコメントいただければ幸いです。

これからつくる iPhoneアプリ開発入門 ~Swiftではじめるプログラミングの第一歩~(仮)
藤 治仁 徳弘 佑衣 小林 加奈子 小林 由憲
SBクリエイティブ
売り上げランキング: 140,408

まとめ

今回はiOSアプリ開発において欠かせないデータ管理のためのクラスNSUserDefaultsがXcode8+Swift3の環境において使えないという問題を解消しました。もし困っている方がいらっしゃったら是非試してみてください。

詳解 Swift 改訂版
詳解 Swift 改訂版
posted with amazlet at 16.09.28
SBクリエイティブ (2016-02-26)
売り上げランキング: 27,708

0 件のコメント :

コメントを投稿