Swift

Swift:Intかどうかのチェックと処理

DoubleからIntに変換したほうが無難そうですね。

追記1/22/2016: AnyObjectがString / Int / Double / String配列 / Int配列 / Double配列かわからないとき、これを判別するには? 1/22/2016ブログを参照してください。文字列よりもやや複雑ですが、できなくはないです。

文字列のデータタイプが不明なとき、Doubleで処理していったほうがよさそうです。何か規則があると思いますが、文字列をDoubleでチェック/変換して、そのあとにIntに変換することにしました。nilのときに何かするというのは気になったからです。以前、自信たっぷりに書いたことを修正しないといけないかもしれません。

こんなことを言う背景は、Double(wChar) はnilでないならDoubleですが、Int(wChar)はnilでないからと言ってIntとはならないことと、またDoubleで処理しておけば桁落ちの心配がないからです。

サンプルプログラムは次の通りです。var wNo:Int = 0を入れないとエラーになります。

let wValue:String   = “123456789.123456789012345”
let wChar:String    = “abc”
var wNum:String     = wValue
var wObj:AnyObject  = wValue

let wFloat:Float    = (wNum as NSString).floatValue
let wDouble:Double  = (wNum as NSString).doubleValue
let wInt:Int        = (wNum as NSString).integerValue

if String(wNum) != nil  { print(“\(wNo++). String(wNum) != nilのとき、 その結果wNum =\(wNum)となる。”)  }

if Int(wNum)    == nil  { print(“\(wNo++). Int(wNum) == nilのとき、    その結果(wNum as NSString).integerValue =\(wInt)となる。”)  }

if Double(wNum) != nil  { print(“\(wNo++). Double(wNum) != nilのとき、 その結果(wNum as NSString).doubleValue  =\(wDouble)となる。”)  }

if Int(wChar)    == nil { print(“\(wNo++). Int(wChar) == nilのとき、   wChar =\(wChar)となる。➡️nilでないならInt?そうとは限らない。”)  }

if Double(wChar) == nil { print(“\(wNo++). Double(wChar) == nilのとき、wChar =\(wChar)となる。➡️nilでないならDouble?その通り。”)  }

if Double(String(wInt)) != nil { print(“\(wNo++). Double(String(wInt)) != nilのとき、   wChar =\(wInt)となる。”)  }

1. String(wNum) != nilのとき、 その結果wNum =123456789.123456789012345となる。
2. Int(wNum) == nilのとき、    その結果(wNum as NSString).integerValue =123456789となる。
3. Double(wNum) != nilのとき、 その結果(wNum as NSString).doubleValue  =123456789.123457となる。
4. Int(wChar) == nilのとき、   wChar =abcとなる。➡️nilでないならInt?そうとは限らない。
5. Double(wChar) == nilのとき、wChar =abcとなる。➡️nilでないならDouble?その通り。
6. Double(String(wInt)) != nilのとき、   wChar =123456789となる。

 

Categories: Swift, 技術