2017-01-02 10 views
1

次のコードスニペットでは、データベースからデータを取得するAPIを呼び出しています。なぜこの文字列がIntegerに変換されるとNilとして出力されますか?

let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] 

if let dict = json?["personalLeagueStats"] as? [String:AnyObject] { 
    if let dataMostWinsAgainst = dict["leaguePersonalMostWinsAgainst"] as? [[String : AnyObject]] { 
     let newdictMostWinsAgainst = dataMostWinsAgainst.first! 
     let tempMostWinsAgainstUserName = newdictMostWinsAgainst ["member"] as? String 
     let tempMostWinsAgainstNumber = newdictMostWinsAgainst ["winPercentage"] as? String 
     let temp2number = Int(tempMostWinsAgainstNumber!) 
     print (temp2number) 
     self.mostWinsAgainstPlayer.text = tempMostWinsAgainstUserName 
    } 
} 

私は私のSQL文は私が私が欲しいスウィフトにおけるので、割合としての私のアプリでは、この値を表示する例えば0.67

の値を返すよう整数として格納されていると信じていたデータ(winPercentage)私はSwiftを勉強しようとしているので、なぜPHPでこれをしないのかと聞かないでください。将来の参照のためのプロセスを知りたいと思います。

winPercentageの値が格納されている場合のスニペットは、tempMostWinsAgainstNumberの文字列として格納されていることは理解できます。

これを整数に変換して(計算を実行して)値を出力すると、nilが印刷されます。

これはなぜですか?

`[" winPercentage "]に格納された値を整数に変換して100倍にするにはどうしたらいいですか?

+3

「0.67」は間違いなく整数ではない。 – vadian

答えて

1

Intではなく、0.67Doubleに変換する必要があります。

let tempMostWinsAgainstNumber = newdictMostWinsAgainst ["winPercentage"] as? String 
guard let temp2number = Double(tempMostWinsAgainstNumber) else { 
    // the String could not be converted to a Double 
} 
print(temp2number) 
+1

ありがとう、それはうまくいった - なぜこの例では「ガード」を使うのだろうか? – RDowns

+1

'String'は' Double'に変換できない可能性があります。この 'Double'の初期化子は、利用可能です。すなわち、' Optional'バージョンの自己を返します( 'Double?')。 'guard'ステートメントは、このオプションの値を安全にラップするための1つの方法です。 – nathan

+1

'String'を' Double'に変換できなかった場合には、以前と同じように '!'でオプションのアンラップを強制すると、アプリケーションがクラッシュします。 – nathan

関連する問題