書いて覚えるSwift入門

第23回 型は苦しい(かもしれない)が役に立つ

この記事を読むのに必要な時間:およそ 3 分

なぜSwiftは静的な型を採用したのか?

前回紹介したとおり,Swiftの公式サイトのAbout Swiftには,

  • 安全(Safe)
  • 高速(Fast)
  • 豊かな表現力(Expressive)

という3つの特長が挙げられています。ところでSwiftは静的型をしています。つまりSwiftの生みの親たちは静的型がこの3つの特長に有利だと判断したということですが,なぜ静的型を採用すると安全で高速で表現力が豊かになるのかきちんと型られた,もとい語られたことは意外に少ないように筆者には思われます。本記事では他の言語の例も交えつつ,Swiftの型に対する姿勢を見ていくことにしましょう。

varでも変えられないもの

では早速実例を見てみましょう。PlaygroundかREPLで,次のように入力してみてください。

var number = 20
number += 1
number *= 2
number += 0.195

最後のところでerror: binary operator'+=' cannot be applied to operands of type 'Int' and 'Double'というエラーが出ているはずです。整数に浮動小数点数は足してはダメだということです。

今度はRubyで同じことをしてみましょう。以下はirbで実行してみた例です。

irb(main):001:0> number = 20
=> 20
irb(main):002:0> number += 1
=> 21
irb(main):003:0> number *= 2
=> 42
irb(main):004:0> number += 0.195
=> 42.195

一見Rubyの方が便利に思えます。が,さらに続けてこう打ってみましょう。

irb(main):005:0> number = "#{number}km"
=> "42.195km"
irb(main):006:0> number *= 2
=> "42.195km42.195km"

いつの間に数値だったnumberは文字列になってしまっています。

今度はSwiftに戻って次のようにしてみましょう。

var number:Double = 20
number += 1
number *= 2
number += 0.195

今度は42.195になったはずです。さらに続けて

number = "\(number)km"

としてみると,error: cannot assign value of type 'String' to type 'Double'で止まります。

この観察から,Swiftの型の特徴が見えてきます。

  • 型は変数宣言の時点で決まる
  • 型を明示しなくともよい。しない場合は推論される
  • 変数に異なる型の値を代入することはできない

1つ注意が必要なのは,Rubyに型がないわけではないということ。Rubyの値は必ずクラスという名の型を持っています。変数にどんな型のどんな値でも代入できるだけで。一度宣言した変数に異なる型を代入できない言語を静的型言語(statically typed languages)⁠どんな型でも代入できる言語を動的型言語(dynamically typed languages)と呼びます。C,C++,C#,Objective-C,Javaなどは前者,JavaScript,PHP,Perl,Python,Rubyなどは後者に属します。いわゆるスクリプト言語はほとんど後者に属するのは興味深いところです。ではSwiftはスクリプト言語ではないかというと,以下が動く以上スクリプト言語であるという見方もできなくはありません。

$ cat > ./helloswift
#!/usr/bin/env swift
print("Hello, World!")
$ chmod +x ./helloswift
$ ./helloswift
Hello, World!

にもかかわらずSwiftが静的型を採用しているのは,型推論(type inference)を採用できたことが大きいでしょう。静的型言語も動的型言語もずいぶん昔からありましたが,型推論の導入は前世紀末で,実用的になったのは今世紀に入ってからといっても過言ではありません。なぜ実用的になったのが比較的最近かといえば,コンピュータの性能が上がったから。PlaygroundやREPLはユーザから見たらインタラクティブなので一見インタープリタに見えますが,実は都度コンパイルしているのです。

「やりたいことをやる」にはいちいち型を宣言するのはめんどくさい。しかし「やってほしくないことをやらない」ためには型でやれることを制約したほうがいい。せっかくコンピュータの性能が上がったのであれば,両者のいいとこ取りができた方がよいのは「宣言する」までもないことでしょう。

著者プロフィール

小飼弾(こがいだん)

1969年生まれ,東京都出身。元ライブドア取締役の肩書きよりも,最近はPokemon GOのガチトレーナーのほうが有名になりつつある……かもしれない永遠のエンジニアオヤジ。

活躍の場はIT業界だけでなく,サブカルからアカデミックまで多方面にわたり,ネットからの情報発信は気の向くまま毎日毎秒! https://twitter.com/dankogai,ニコニコチャンネルは,http://ch.nicovideo.jp/dankogai,blogはhttp://blog.livedoor.jp/dankogai/

当社刊行書籍は『小飼弾のアルファギークに逢ってきた』『小飼弾のコードなエッセイ』など。他にも著書多数。

コメント

コメントの記入