質問: (userDefaults.object(forKey: "teamID")! as? String)! です。 userDefaultsの箇所なのですが、新しい実機でビルドすると値を取得できないとかあるのですか? わかる方教えてください。
回答: `UserDefaults`というのは、自分で値をセットしないと値は取り出せないのですが、アプリケーション起動時等、`object(forKey:)`を呼び出す前に`Userdefaults.standard.register([String: Any])`で該当するキーの値をセットしていますか? もしくは、`userDefaults.set("[チームID]", forKey: "teamID")`で、値をセットしていますか? もしセットしていないのであれば、 `userDefaults.object(forKey: "teamID")`の直後の`!`で、`nil`をアンラップして落ちてしまうのだと思います。 ですので、一番簡単な解決方法は、 `let teamID: String = (userDefaults.object(forKey: "teamID") ?? "[teamIDがnilだったときのデフォルト値]" as? String)!` なのですが、UserDefaultというのは、どちらかというとアプリケーションの設定などを保存すべき場所で、例に示されたチームIDは、外部ファイルやCoreData, SQLite等のデーターベースファイルに保存すべきだとは思います。 このため`userDefaults.object(forKey: "teamID")`が`nil`にならないプログラムを作るには、 プロジェクト内に`defaults.plist`を作り、そこに参照されるキー(今回の場合だと`teamID`ですね。)の値を全て列挙しておき、アプリケーション起動時(`applicationDidFinishLaunching`等)に ``` do { let bundle: Bundle = Bundle.main if let defaultsURL: URL = bundle.url(forResource: "defaults", withExtension: "plist") { let defaults: Dictionary = try NSDictionary(contentsOf: defaultsURL) UserDefaults.main.registerDefaults(defaults) } // end found defaults.plist } catch { print("defaults.plist is not found") } ``` として、以降プログラムで参照する値を登録しておく必要があります。