【対処法】Swift 2(iOS 9)ではUITextFieldのtextがString?になっている
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
Swift 1(iOS 8)時代において、UITextFieldのtextプロパティは
var text: String!
だったのですが、Swift 2(iOS 9)で型が変更されて
var text: String?
となりました。これによってコードを修正しなければならない場合があるので、解説したいと思います。
String型の定数・変数などに代入する場合
Swift 1(iOS 8)
textプロパティの型はString!なので、そのまま代入していました。
let text : String = textField.text
Swift 2(iOS 9)
先ほどのコードをそのまま使ってしまうと、
let text : String = textField.text
以下のようなエラーが出てしまいます。
value of optional type ‘String?’ not unwrapped; did you mean to use ‘!’ or ‘?’?
textプロパティの型はString?だから、String型の定数や変数にそのまま代入できません。
以下のようなコードを書いて対応しましょう。
!を使ってForced Unwrapping(強制的アンラップ)する
let text : String = textField.text!
代入先の定数・変数の型をString?に揃える
let text : String? = textField.text
if let を使う
if let text : String = textField.text { // textを使って何らかの処理を行う }
?? を使って、textプロパティがnilの時には “”(空文字)を代入する
let text : String = textField.text ?? ""
textプロパティの中身を数値に変換したい場合
まず注意点として、Swift 2ではtoInt()が使えなくなっています。
Swift 2でtoIntが使えない!unavailableエラーが出た時の対処方法
Swift 1(iOS 8)
toInt()を使ってInt型の数値に変換していました。
let num : Int? = textField.text.toInt()
ただし、toInt()での変換は失敗する場合があり(”Hello”などの文字列を数値に変換しようとした場合など)、その変換結果はIntではなくInt?なので、if letなどを使って適切に処理する必要があります。
if let num : Int = textField.text.toInt() { // 変換成功。numを使って処理を行う }else{ // 変換失敗。 }
Swift 2(iOS 9)
textプロパティがString?型であり、toInt()も使えなくなっているので、かわりにInt()イニシャライザーを使って適切に処理しなければなりません。
2つのif letで場合分けする
if let text : String = textField.text { // textがnilではなかった場合 if let num : Int = Int(text) { // 数値に変換できた場合 }else{ // 数値に変換できなかった場合 } }else{ // textがnilだった場合 }
1つのif letで場合分けする
if let text : String = textField.text, num = Int(text) { // textがnilではなくて、textをInt型の数値に変換できた場合 }else{ // textがnilか、textをInt型の数値に変換できなかった場合 }
textがnilの場合は””(空文字)、Intに変換できなかった場合は0扱いにする
let text : String = textField.text ?? "" let num : Int = Int(text) ?? 0
上記の例を1行にまとめる
let num : Int = Int(textField.text ?? )
flatMapを使って変換する(ただしnumはInt?)
let num : Int? = textField.text.flatMap{ Int($0) }
@akio0911はこう思った。
Swift 2・Xcode 7・iOS 9に移行して、つまづきやすいポイントのうちの1つが、今回紹介したUITextFieldのtextプロパティの扱いかなあと思います。
オプショナル型(String?・Int?)やif letなどについては以下の本に詳しく載ってます!
関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!