【Swift】iphone5とiphone6でのNSUserdefaultの仕様が違う

【Swift】iphone5とiphone6でのNSUserdefaultの違い

※本記事はSwift言語利用時のものです。Objective-cでは試していません

以前まではObjective-CでiPhone向けアプリの開発を個人的にしていたのですが、「時代の流れに乗らなきゃ!」と思ってSwiftも勉強し始めて、新しい簡単なアプリをSwiftで書き始めていた時に、NSUserdefaultで少しハマったのでその覚え書きについて書いておきます。

 

NSUserdefaultでなんか微妙に嵌った

NSUserdefaultに格納しているPointというObjectがnilだったら0を代入し
その値を取得する関数を作っていた時の話。

 

iphone6(plus),iphone6Sの場合

 // 画面に表示する現在の生産ポイントを取得する関数
func GetElinPoint() -> Int{
let Elin = NSUserDefaults.standardUserDefaults()
let ElinPoint : AnyObject! = Elin.objectForKey("point")

return ElinPoint as! Int
}

このソースコードでも、ElinPointにちゃんとInt型で値を返却してくれるのがiphone6(plus),iphone6Sです。なんて親切なんでしょう。ちょっと感動しました。
ただ、この状態でiphone5で動作確認をするとエラーとなりました。
エラーメッセージ自体は単純で「cast出来ません」とのこと。

約1時間くらい原因を模索していて、凄く基本的な誤りであることに気づけてよかったです。
そもそも、NSUserdefaultからObject型で値を取得している事自体おかしいんですよね。このままだとアドレス値を引っ張ってきます。なので上記コードでいえば4行目が明らかにおかしい。

 

iphone5,5Sでも動くコード

 // 画面に表示する現在の生産ポイントを取得する関数
func GetElinPoint() -> Int{
let Elin = NSUserDefaults.standardUserDefaults()
let ElinPoint : AnyObject! = Elin.integerForKey("point")

return ElinPoint as! Int
}

こうすれば、Int型でNSUserdefaultのPointアドレスの中に入っている値を取得できます。

 

まり

iphone6(Plus)とiphone6Sについては、Object型のままNSUserdefaultからデータを取得し、画面表示を行う際にInt型にcastしようとすると、ポインタを参照しその中に格納されているデータを取得してくれるんですが、iphone5,iphone5Sだとポインタそのもののアドレスをcastしようとするためエラーとなります。

初歩的なミスでした。っていうのとやっぱりSwiftになって型の概念というか型の厳密さが失われたのかな?と少し感じたのですがやっぱり、Objective-Cと同じくSwiftでもここらへんは厳密に型を意識しないといけないんですね。
こう考えると、Excelで使えるVBAみたいに一切型を意識しなくて使える言語って人間にとって親和性の高い言語だけど、パソコンにとっては余計な処理をたくさん発生させる疲れる言語なんだなぁとしみじみ感じました。

 

らいか
こういった微妙な仕様の違いってどこかに教えてあげると良かったりするのかな?
【Swift】iphone5とiphone6でのNSUserdefaultの違い

SNSへのシェアはこちらから!

ABOUTこの記事をかいた人

工業高等専門学校を卒業後、NTTグループのSI企業に就職。数々の炎上案件を鎮火するために日本各地を5年間転々とする。2015年に一般ユーザ向けのWebシステム開発案件のチームリーダとして業務に従事し、改めて"Webのものづくりの楽しさ"に気付きWeb制作会社に転職。Web制作やアクセス解析を使ったオウンドメディアの運用改善などを行っていく中で、もっとユーザー目線でWebをただ制作するだけではなく企画や運用まで幅広い領域で仕事がしたいと感じるようになり、Webディレクターのキャリアを目指す。日本中のビジネスホテルに詳しく、犬や猫よりも鳥派。