二重定義された変数がその値を失うことなくIntに変換可能かどうかを確認する必要があります。これらは異なるタイプであるため、これは機能しません。
if self.value == Int(self.value)
ここで、self.value
はdoubleです。
Double値を「フロアリング」してから、変更されていないかどうかを確認してください。
let dbl = 2.0
let isInteger = floor(dbl) == dbl // true
整数でない場合は失敗します
let dbl = 2.4
let isInteger = floor(dbl) == dbl // false
% 1
はゼロです。
スウィフト3:
let dbl = 2.0
let isInteger = dbl.truncatingRemainder(dividingBy: 1) == 0
Swift 2:
let dbl = 2.0
let isInteger = dbl % 1 == 0
スイフト3
if dbl.truncatingRemainder(dividingBy: 1) == 0 {
//it's an integer
}
これを確認するための小さな拡張機能:
extension FloatingPoint {
var isInt: Bool {
return floor(self) == self
}
}
それからただやる
let anInt = 1.isInt
let nonInt = 3.142.isInt
シンプルなソリューション
値をInt
に変換してからDouble
に変換し、新しい値を確認することをお勧めします
if value == Double(Int(value)) {
// The value doesn't have decimal part. ex: 6.0
} else {
// The value has decimal part. ex: 6.3
}
DoubleをInt(小数点を切り捨てる)に変換してからDoubleに戻し、それを元のDoubleと比較してみてはどうでしょうか。例えば:
var dbl:Double = 22/3
dbl == Double(Int(dbl))
// false: dbl = 7.33333... Double(Int(dbl)) = 7.0
dbl = 25
dbl == Double(Int(dbl))
// true: dbl = 25.0, Double(Int(dbl)) = 25.0
Mod(%)を使用しても機能しなくなります。
使用できるようになりました:
let dbl = 2.0
let isInteger = dbl.truncatingRemainder(dividingBy: 1.0) == 0.0