2016-06-21 13 views
4

文字列をIntに変換するとオプションの値が返されますが、DoubleをIntに変換してもオプションの値は返されません。何故ですか? double値が最大Int値よりも大きいかどうかをチェックしたいのですが、変換関数がオプションの値を返さないため、オプションのバインディングを使用してチェックすることができません。DoubleをIntに変換するのがSwiftのIntを返さないのはなぜですか?

var stringNumber: String = "555" 
var intValue = Int(stringNumber) // returns optional(555) 

var doubleNumber: Double = 555 
var fromDoubleToInt = Int(doubleNumber) // returns 555 

したがって、最大整数より大きい倍数を変換しようとすると、nilを返す代わりにクラッシュします。

var doubleNumber: Double = 55555555555555555555 
var fromDoubleToInt = Int(doubleNumber) // Crashes here 

私は二重の数が最大の整数値よりも大きいかどうかを確認する別の方法があることを知っているが、私はそれがこのように起こっている理由として興味があります。

+0

私はダブルの一体的なバージョンがあることは疑いがありますので、それはだと推測するだろう、常にスウィフトの数値はあなたを介してジャンプするすべての他のフープに加えて、アンラップことは非常に不便だろう。スウィフト_do_クラッシュのオーバーフロー状態は一般的なので、このことも驚くべきことではありません。あなたが好きではない場合、あなたは確かにオプションを返す関数を書くことができます! – matt

答えて

0

任意の戻り値の型を持つ利用可能なイニシャライザとメソッドは、プログラマがパラメータ値によってエラーが発生するかどうかを知ることができない場合、または操作が成功することを確認する操作が操作を実行する場合と同じです。

let intFromString = Int(someString) 
let valueFromDict = dict[someKey] 

文字列から整数を解析するには、数字/数字以外の文字列をチェックする必要があります。チェックは作業と同じです。同様に、キーの存在を辞書でチェックすることは、キーの値を調べることと同じです。これとは対照的に

は、特定の操作は、あなた、プログラマは、お使いのパラメータまたは前提条件が期待を満たしていることを先行を確認するために必要なものです:

let foo = someArray[index] 
let bar = UInt32(someUInt64) 
let baz: UInt = someUInt - anotherUInt 

することはでき - と、ほとんどの場合、必要があります - 実行時にテストindex < someArray.countsomeUInt64 < UInt32.maxおよびsomeUInt > anotherUInt。これらの仮定は、そのような種類の作業には基本的なものです。一方では、あなたはreally want to design around them from the startです。もう一方では、数学のすべてのビットに、オプションのアンラップを付けることは望ましくありません。そのため、公理が前もって記述されている型があります。

3

我々は最もダブルスのために、Intへの変換は単純に小数部分を削除する意味と考える場合:

let pieInt = Int(3.14159) // 3 

その後Int(Double)コンストラクタはnilを返しているだけの場合は、オーバーフローの場合であり、 。

文字列の場合、Intに変換すると、通常「Hello world!」などの文字列が含まれているため、オプションで文字列が返されます。普遍的に意味をなさない方法でIntとして表すことはできません。したがって、文字列を整数として表すことができない場合は、nilを返します。 dPi3.14159いる間iPinilあり、この場合に

let iPi = Int("3.14159") 
let dPi = Double("3.14159") 

が検討:これは完全に倍増として表さまたは浮遊することができるよう、値によって、含まれています。どうして? "3.14159"には有効なInt表現が含まれていないためです。

一方、Doubleをとり、非オプションの値を返すIntコンストラクタを使用すると、値が取得されます。

したがって、コンストラクタを変更してオプションの値を返すと、nilの代わりに33.14159に返されるのはなぜですか? 3.14159は整数として表すことはできません。

しかし、は、オーバーフローする可能性がある場合に、の代わりにnilを返して、オプションのIntを返すメソッドを作成することができます。

extension Double { 
    func toInt() -> Int? { 
     let minInt = Double(Int.min) 
     let maxInt = Double(Int.max) 

     guard case minInt ... maxInt = self else { 
      return nil 
     } 

     return Int(self) 
    } 
} 

let a = 3.14159.toInt() // returns 3 
let b = 555555555555555555555.5.toInt() // returns nil 
関連する問題