前回、整数と小数を一緒に計算しようとしたらエラーになってしまいました。 実は、Swiftでは異なるデータ型の間の計算はできません。 また、整数と小数を一緒に計算しようとするときに、勝手に整数を小数に変換したりもしません。 データ型をプログラマーが変更する必要があります。エラーの見方を確認しながら、実際にプログラムを修正していきましょう。
前回のプログラムのエラーを確認する
まず、前回のエラーになったプログラムを再確認してみましょう。
var a = 10
var b = 5.5
var sum = a + b
print(sum)
これをXcodeのプレイグラウンドに打ち込むと、次のようなエラーが画面下に出てくると思います。
Playground execution failed:
error: SwiftTutorial.playground:4:13: error: binary operator '+' cannot be applied to operands of type 'Int' and 'Double'
var sum = a + b
~ ^ ~
SwiftTutorial.playground:4:13: note: overloads for '+' exist with these partially matching parameter lists: (Double, Double), (Int, Int), (Int, UnsafeMutablePointer), (Int, UnsafePointer)
var sum = a + b
^
英語のメッセージが書いてあって、よくわからないと思うかもしれません。 しかし、プログラムで出てくる英語は文法的には難しくないです。 単語には難しい専門用語もあるのですが、調べれば意味はわかります。 takeやgetのような基本的な単語と違って文脈で意味が変わるということもありません。 英語だからと目をそらさずに、google翻訳などを使いながらどんなメッセージなのか確認するようにしましょう。
さて、今回のエラーメッセージですが、3行目以降にエラーの内容が書いてあります。 エラーメッセージの内容を説明すると次のようになります。
Playground execution failed:
/* エラーの起きているファイル:行:列 */ /* エラーの内容 今回は「2項演算子 '+' は データ型 Int と Dboule には適用できない」という意味 */
error: SwiftTutorial.playground:4:13: error: binary operator '+' cannot be applied to operands of type 'Int' and 'Double'
/* 実際のコードと、ここがエラーだよという表示 */
var sum = a + b
~ ^ ~
/* エラーについての備考
今回は「'+' のオーバーロードで今回のデータ型に部分的に一致するもののリストは (Double, Double), (Int, Int), ...」というもの
要するに、「(Double, Double), (Int, Int), ... というデータ型の組み合わせと間違えてませんか?」ということ*/
SwiftTutorial.playground:4:13: note: overloads for '+' exist with these partially matching parameter lists: (Double, Double), (Int, Int), (Int, UnsafeMutablePointer), (Int, UnsafePointer)
var sum = a + b
^
特に重要なのは、エラーの起きている場所と、その内容です。 今夏は、「SwiftTutorial.playgroundの4行目でエラーが発生」。 内容は「2項演算子 ‘+’ は データ型 Int と Dboule には適用できない」というものです。 つまり、「’+’は’Int’と’Double’の間では使えないよ」とXcodeに怒られているわけです。 このことから、エラーの原因はa、bのデータ型だということがわかりますね。
それではエラーを修正しよう
エラーの原因がわかったので、次に考えるのはどうやってそのエラーを解決するかです。 基本的には’+’の正しい使い方をネットで調べたりします。 しかし、今回はエラーメッセージの7行目、noteの部分に情報が書いてあります。 「’+’は(Double, Double), (Int, Int), … というデータ型の間でしか使えないよ」という話です。 このように、’+’や’*’といった計算は、同じデータ型の間でしかできないのです。
それでは、プログラムをどのように修正したらいいか考えてみましょう。 選択肢は2つで、「IntのaをDoubleにする」か「DoubleのbをIntにする」です。 しかし、小数を整数にするということは、小数点以下の数値データがなくなってしまうということです。 今回は、データがなくなってしまうのは嫌なので、「IntのaをDoubleにする」修正をしようと思います。 (小数点以下なんてどうでもよければ、「DoubleをInt」でもいいでしょう。どちらを選択するかはプログラム次第です)
var a = 10
var b = 5.5
// a を元にDoubleの数値を作るようにする
var sum = Double(a) + b
print(sum)
このように、Double(a)とすることで、aを元にDouble型のデータを作ることができます。 つまり、10を元に10.0という小数のデータを作るわけです。 これで、DoubleとDoubleの計算になるのでエラーにならずに期待した通りの結果になります。
数値と文字列の変換
この、あるデータを元に別の肩のデータを作る(データ型を変換する)というのは、数値間だけの話ではありません。 数値と文字列の間でも可能なのです。
var num = 123.456
// numを元にStringを作る
print("numは" + String(num))
var numStr = "987.654"
// numStrを元にDoubleを作る
// Double(numStr)の後ろには'!'が必要
var sum = num + Double(numStr)!
// sumを元にStringを作る
print("sumは" + String(sum))
numは123.456
sumは1111.11
Double→Stringの考え方はInt→Doubleと同じですね。 問題は、10行目のString→Doubleの最後にくっついている‘!'(エクスクラメーションマーク、いわゆるビックリマーク)です。 これは、Javaなどにはない、Swiftなどの比較的新しいプログラミング言語にある機能です。 この’!’については、次回解説したいと思います。