Swiftってどんな言語?

今回はiOSやMacOSなどのApple製品上のアプリを作成する上で外せないプログラミング言語Swiftについて、どんな言語なのかをまとめていきたいと思います。
実際の文法などには触れずに言語の特徴などをまとめていきます。

言語の概要

公式ドキュメントはこちら

Swiftは2014年にiOSやmacOSのアプリの開発言語としてAppleが開発したプログラミング言語です。
つまり、AppleがAppleのために作った言語ということですね。
抜け目ないAppleさんなので、当然、watchOS、tvOS、iPadOS向けのアプリにも対応しています。
現在ではオープンソース化され、Linuxでの実行環境も提供されています。

Swiftは安全でパフォーマンスが良いモダンなアプローチとソフトウェアのデザインパターンを利用して構築された汎用プログラミング言語です。
Swiftの設計方針として、開発者にとって正しくプログラムをコーディング・保守していくことをより簡単に行うことを目指しているそうです。
公式ドキュメントにそんな感じのことが書いていました。

そんなSwiftの特徴を見ていきます。

言語の特徴

Swiftの特徴をざっくりまとめると、「簡潔な文法で書けるけど、高い安全性を持っている言語」という感じでしょうか。
具体的に見ていきましょう。

特徴1.静的型付けの言語である

静的型付けとは、ざっくりいうと変数や定数の型が実行前の段階で決定される言語です。Javaとかがそうですね。
つまり、数値型の変数はずっと数値型で文字列型の変数はずっと文字列型の変数になるということですね。
静的型付けの言語は誤った型の代入などを実行前にコンパイルエラーとして検知できるため、動的型付けの言語よりも広い範囲でプログラムの妥当性を検証でき、安全性が高い言語といえます。

特徴2.nil(値が存在しないこと)の許容性をコントロール可能

nilは他のプログラミングではnullやnoneなどで表現されることのあるアレです。
値の参照がない状態を表すことができるnilですが、nilの値にアクセスすることによるエラーなど実行時エラーの原因となりがちなやつでもあります。
Swiftでは変数や定数に対してnilの許容をコントロールできる設計となっているのです。
基本的に、変数や定数にはnilを代入できない仕様となっており、nilを許容したい場合は特別な型を用いる必要があります。
このような仕様にすることでnilによる実行時エラー発生を回避するようにしています。

特徴3.簡潔な記述が可能

Swiftは型推論という仕組みが導入されており、プログラムを簡潔に記述することが可能となっています。
型推論とは、代入する値からコンパイラが型を推測する仕組みのことで、コンパイラが推測可能な型の変数や定数であれば宣言時に型を明示する必要がなくなります。

let num = 123 // numをInt型だと推論している
let num2:Int = 123 // 型を明示する場合

特徴4.静的型付けだけど汎用的な記述も可能

Swiftではジェネリクスという機能を利用することで特定の型に制限されない汎用的なプログラムを記述することが可能です。
詳しい記述はここでは避けますが、ジェネリクスでは抽象的な型の引数を用いることで型の安全性を損なうことなく汎用的なプログラムの記述を実現しています。

特徴5.Objective-Cと連携可能

従来のiOS・macOSの開発言語であったObjective-Cと連携可能なところもSwiftの特徴です。
Objective-Cにはアプリ構築のためにCocoaというフレームワークが提供されているらしいのですが、その資産をSwiftでも利用可能となっているそうです。
さすがAppleさん、抜け目ないですね。

実際に動かしてみる

Swiftの大まかな特徴を見てきましたが実際に動かしてみてみましょう。
今回はXcodeで提供されているPlaygroundというインタラクティブな実行環境で動かしてみたいと思います。

Playgroundの環境を準備

⒈Xcodeのメニューから[File]>[New]>[Playground]を選択


⒉初期設定のままNextをクリックし、ファイル名とファイル作成する場所を決めてPlaygroundの作成を完了させる。

⒊メニューの[View]>[Debug Area]>[Show Debug Area]を選択するとコンソールが表示される。

コードを書いていく

とりあえず上記の特徴がわかるようなごく簡単なコードを書いていきます。

⒈静的型付け、型推論による記述

⒉nilを代入しようとするとエラーとなる

⒊汎用的なプログラムが書ける

max(x, y)関数は渡された2つの引数のうち、大きい方を返します。
この時、渡される引数はT: Comparableの部分でComparableプロトコルに準拠した型を指定しています。
そして、(_ x: T, _ y: T)の部分でx,yが共に同じ型であることを示しています。
呼び出し箇所を見てみると、1つ目はx,yがInt型として呼び出されており、2つ目はString型として呼び出されていることがわかります。


スクショだけだとわかりづらいと思うのでコードも載せておきます。

print("Hello, World!")
var num1 = 10 // 型推論で代入
var num2:Int = 20 // 型を明示して代入
var sum = num1 + num2
print(sum)

//num1 = "123" // 静的型付けなのでIntにStringを代入しようとすると怒られる


var x:String = "nil"
//x = nil //nilを代入しようとすると怒られる


// 汎用的なプログラム
func max<T>(_ x: T, _ y: T) -> T where T: Comparable {
    if (x < y) {
        return y
    }else {
        return x
    }
}

var number1 = 123
var number2 = 456
var maxNumber = max(number1, number2)

var str1 = "abc"
var str2 = "def"
var maxStr = max(str1, str2)

まとめ

SwiftはAppleのために作られた、簡潔にコーディングができて安全性も高い高機能な汎用プログラミング言語ということがわかりました。
開発者が意識することなく高い安全性を保てるのは静的型付け言語のありがたいところですね。その上で型の明示など煩わしい記述が少なく済むのは更にありがたいです。
次回以降はより具体的にSwiftのコーディングの内容について学んでいきたいと思います。

最後までお読みいただきありがとうございました。
それでは、また。