2020 PC Conferece

Swift によるプログラミング教育について
箕原⾠夫*1
Email: minohara@cuc.ac.jp*1: 千葉商科⼤学政策情報学部政策情報学科◎Key Words

1.

Swift，プログラミング教育，Python，プログラミング⾔語

はじめに⾮常勤講師として勤める慶應義塾⼤学藤沢湘南キャン
パスにおいて、2019 年秋学期１コマの授業で Swift を使ったプログラミング教育の講義を⾏なった。その講義を通じて経験した、Swift によるプログラミング教育の意義と問題点について考察し、特に、Python を⽤いたプログラミング教育との⽐較を考える。Swift は、コンパイラとインタープリタの両⽅の開発環境を備えており、Mac OSX だけでなく、Ubuntu/Linux 上でもインタープリタが稼働するため、インタープリタを利⽤したプログラミング基礎教育を⾏なった。Apple Computer の⽅針に添って、過去との互換性をかなぐり捨てつつ⾔語仕様を進化させている Swift であるが、アプリケーションを開発するためのコンパイル⾔語としても機能させるために、複雑な制御構⽂などを導⼊している。その功罪について考察する。

2. 授業内容と授業環境
2.1 科⽬の位置付け
慶應義塾⼤学湘南藤沢キャンパスでは、1 年次に必修の科⽬として、「情報基礎 1」を春学期週 1 コマ 2 単位、「情報基礎 2」を秋学期週 1 コマ 2 単位で開講されている。
この科⽬では、2019 年度までは JavaScript, HTML, CSSなどを学⽣は学んでいた。
なお、2020 年度からは、Pythonを学ぶことに変更されている。1 年次秋学期以降は、プログラミング系の科⽬を履修可能になっており、「情報基礎1」の科⽬の履修を前提として、「オブジェクト指向プログラミング基礎」という科⽬を週 1 コマ 2 単位として春学期・秋学期同じ内容で担当している。なお、秋学期に担当した 2 コマの同名の科⽬のうち、1 コマは Python、もう1 コマはSwift をプログラミング⾔語として扱うようにシラバスを構成した。学⽣は、同名の科⽬なので、どちらかの 1 コマだけしか選んで履修することしかできない。
Swift を対象のプログラミング⾔語として選択したのは、2019 年度秋学期が最初であり、試⾏錯誤を伴うかなり実験的な授業になった。なお、学⽣は卒業時までにプログラミング系の授業を 4 単位取得する必要があり、この授業を受けても、更にもう 1 科⽬履修する必要がある。

して、毎回教員がプロジェクタを使って、実際のプログラムを解説とともに⼊⼒して、授業回の中でいくつかのプログラム課題を出すという旧来からの⽅式に変更はない。
ただし、Python の授業も同じだが、Swift の授業でも毎回の授業冒頭で⼩テストを⾏ない、理解度のチェックと出席確認を兼ねている。
各回の授業設計は、クラスの記述まで⾏なえるようなシラバスを⽴てたが、表にあるように、達成できたのは、リスト（配列）などを本格的に扱うところの導⼊までに留まった。後で説明する Swift 特有の、先進的な⾔語で採⽤されている仕組みを整理せずになんでもかんでも導⼊してしまっている⾔語設計に翻弄されてしまった形になっている。過去の PC Conference でも、Swift を使ったプログラミング教育に関する発表もあって、そのときに発表者と議論したが、Swift の⾔語のバージョンの移り変わりについて、どの教育者も悩まされている状況にある。Python
も、最新版はかなりいろいろな要素が付け加わっているが、過去に記述されたプログラムがまったく動かないというような変更は Python 2 から Python 3 に替わるところだけだったので、Swift のように過去のプログラムがほぼ動かない 4.0 版以降の悩みからは解放されている。

2.2 各回の授業設計
毎回の授業は、基本的には、基礎プログラミング教育と-142-

授業回

表 1 各回の授業内容
実際に授業で扱った内容

第1回
第2回
第3回
第4回
第5回
第6回
第7回

開発環境の導⼊とオブジェクトモデルの説明
Swift のリテラル
⽂字列と構造的なリテラル
ターミナルへの⼊出⼒とオプショナル型
if ⽂による条件分岐
switch ⽂による条件分岐・その他の制御⽂
while ⽂と for ⽂による繰返し

第8回
第9回

範囲指定と for ⽂
その他の制御構⽂（break ⽂, continue ⽂）

第 10 回
第 11 回
第 12 回
第 13 回

関数定義
整数論の関数・再帰関数
Swift 特有の関数呼出し
クロージャ・ジェネリック関数と内部関数

第 14 回
第 15 回配列と典型的な操作
配列と⾼階関数・2 次元配列

2020 PC Conferece
これらの授業回以外に、エキストラの授業を 2 回⾏なった。1 回⽬のエキストラの授業は、Xcode を使った GUIアプリケーションの開発で、UIKit から SwiftUI(2)に変更されたものに対応するための授業で、もう 1 回は SwiftUIを⽤いて実際にイベント駆動でユーザの⼊⼒に対応する
GUI アプリケーションのプログラミングの解説を予定していたが、学⽣の要望により、最後の課題の説明に終わった。課題としては、以下のようなプログラムを記述してもらった。最後の課題では、⽂字列の分解や辞書構造を利⽤する問題となっている。Python でも同様の問題を課題として出しているが、Swiftでは⾔語構造の解説に⼿間取り、出題個数がかなり限られたものになった。
・ 完全数を素数とメルセンヌ数から⾼速に求める問題
・ ⼊⼒された整数を素因数分解する問題
・ floor 関数と ceil 関数を定義する問題
・ 英語を単語分解して、単語ごとに⽇本語訳に変換する問題（簡単な語順の⼊れ替えも含む）

2.3 受講学⽣と授業評価
学⽣は、先修科⽬の情報基礎 1 および 2 で JavaScriptや HTML, CSS を学んできているが、2019 年度までは情報基礎での扱いはWebのマッシュアップのためのツールとして学んでいるに過ぎず、プログラミング教育としては科⽬設計されていない状態であった。そのため、授業としては、プログラミングをほぼ経験してこなかった学⽣を対象に授業展開をせざるを得なかった。また、1 年次に情報基礎の受講が終わって、その内容をほぼ忘れてしまっている 2 年次以降の学⽣も多いため、「基礎」が科⽬名についたプログラミング系の科⽬では、最初からプログラミング教育を再度始めなければならない。
Swift の開発環境である Xcode(3)が Mac OS X でしか動かないこともあり、学⽣の履修者数は、33 名と限られたが、その中でも 4 名ほどは履修しただけで 1 回も授業に出てこず、毎回の授業の出席者数は 23〜25 名程度に限られていた。履修してきた学⽣の中には、Swift でアプリケーションを開発してきた学⽣もいたが、基礎プログラミング教育を受けてこなかったため、総じてアルゴリズムをプログラムに落とし込むのには慣れていない状態であった。
また、学⽣の中には、授業が 4 時限・5 時限と連続していたので、4 時限の Python 版の授業を正規に履修し、5 時限の Swift 版の授業も参考程度に履修する学⽣もみられた。
毎回、スライドの作成に悩まされ、Swift に関しての過去の知識（Swift 4.0 でアプリケーションを作ってきた経験はあった）との差異によって、思うように授業は展開できないでいた。到達⽬標である⾃分でクラス定義してオブジェクトを⽣成するところまでは達成できず、1 コマでの授業の時間の短さと、過去との互換性をかなぐり捨て去る Apple Computer の⽅針を恨みながら、15 回の授業は終了した。ただし、学⽣からの授業の評価は例年の授業評価および Python 版での授業の授業評価と⽐べてそれほど悪くなかった。プログラミング基礎の部分は、学⽣は共通して学べたのではないかと考えている。

2.4 授業で⽤いた学⽣の開発環境
Swift ⾃体は、Mac OS X と Linux 上でしか稼働しないため、Windows のノート PC を利⽤して受講する学⽣はいなかった。受講者の全員が、MacBook Pro/Air のいずれかを持参して受講する形になった。また、基本的な開発環境として Xcode の統合開発環境をインストールする必要があり、このダウンロードとインストールについては、⾮常に⼤きなサイズで時間が掛かるために、予め第 1 回⽬の授業開始前に受講学⽣にメールを出して、インストールをしてから参加してもらうようにしてもらった。ただし、授業で使うのは、コンパイラの⽅ではなく、インタープリタの Swift の開発環境であったため、Xcode ⾃体はSwiftUI 等のアプリケーション開発のとき以外は使わず、授業での標準的な開発環境として、古くから Mac では⽤いられているプログラミング⽤のテキストエディタである BBEdit(4)を使うことにした。
Xcode を避けたのは、⼩さなプログラムを実⾏するのにも、アプリケーションの形で 1 つのプロジェクトにする必要があり、各プログラムを単独で実⾏できる機能がなかったこともある。⼀⽅ BBEdit は、プログラム毎にファイルに保存し、実⾏することができる。特に BBEdit は、今まで数年使い続けてきた TextWrangler（32bit モードでしか動かないので新しい Mac OS X では稼働しない）の後継の 64bit 版のシェアウェアになっており、30 ⽇間の試⽤期間を過ぎても、フリーモードで使い続けることができることが決め⼿となった。VSCode でも Swift は開発することが可能だが、授業開始までの準備が間に合わなかったので採⽤しなかった。
なお、Swift のインタープリタは、コマンドラインから起動できる。BBEdit では設定することによって、標準のターミナルのアプリケーションから起動させることができる。コンパイラではなく、このインタープリタ（/usr/bin/swift）を利⽤することにした。

2.5 授業で⽤いたテキスト
参考図書は、Swift が 2019 年後半に 5.0〜5.1 版になったことによって、ほとんどそれまでの⽇本語のテキストは利⽤できなくなってしまった。特に、4.0 版よりも前の版で書かれているテキストは、ごく⼀部を除き、ほとんど使い物にならなくなってしまった。また、4.0 版に対応して修正された改訂版がでたテキストでも、以前の版の内-143-

2020 PC Conferece
容が残っており、4.0 版以降では使えない内容が混じっているようなテキストもあった。結局、英語版の Apple
Computer および swift.org から出されている“The SwiftProgramming Language”(1)のテキスト以外にはまるで参考にならなかった。ただし、荻原剛志⽒の『詳解 Swift 第4 版』(5)は⾮常に参考になった。だが、この本も 5.0 以降の版には対応していなかった。2019 年後半になってから5.0 以降の版に対応した改訂版が出て、⽇本語で記述された Swift のテキストとしては、⼀番信頼がおけるものとなっている。授業⽤のテキストは、この『詳解 Swift 第 4版』および英語版の The Swift Programming Language の内容を踏襲して、Keynote のスライドを PDF 版に直したものを以下の URL で⼀般公開することとした。ただし、後半部分がまだ未完成な状態のままである。
https://web.sfc.keio.ac.jp/~minohara/lectureslide/swift

3.

Swift 特有の計算式・構⽂

Swift は、先進的なプログラミング⾔語で採⽤されている仕組みを整理せずになんでもかんでも導⼊してしまっている⾔語設計になっており、過去の 4.0 以前の版との互換性がまったくなくなっている状態である。そのため、数⾏のプログラムでも以前は動いていたが、現在の 5.0 以降の版ではまったく動かないという状況になっている。

3.1 インタープリタ⾔語としてSwift は元々コンパイラ⾔語であるので、C++/Java などと同様に厳格な型システムを導⼊している。しかしながら、インタープリタとしても動くようにしているために、柔軟な型推論の機構が⼊っている。その⾯では、厳密な型指定を⾏なう C++/Java に⽐べて、Swift は記述しやすい⾔語とは⾔える。以下のように型指定を省略して記述することが可能になっている。
let message: String = "Hello" // 型指定あり
let answer = "Hi" // 型推論によって省略

let による定数宣⾔と var による変数宣⾔だが、インタープリタでは実⾏時に警告がでる場合もあるが、かなり緩やかなものとなっている。しかしながら、Xcode の開発環
境では、事前にチェックされ、var による変数宣⾔が⾏なわれた後にまったく⾃⼰参照代⼊などを⾏なっていない
変数については、コンパイル前に、let による静的な定数宣⾔に置き換えろと執拗に迫ってくる。

3.2 オプショナル型の記法
初修者が Swift で⼀番に躓く点は、オプショナル型の宣⾔の記法であろう。nil による変数に値がない状態を許す
オプショナル宣⾔の導⼊は、その解凍の記法も伴って、煩わしい記述を必要とされる。例えば、ターミナルから⽂字列を⼊⼒する場合や、⽂字列を数値に変換する際には、このオプショナル型の戻り値が関数から返されるので、それらを解凍するための!演算⼦を記述する必要がある。例
えば、以下の記述はターミナルから整数値を得るときの記法だが、変数宣⾔ではオプショナル型を⽰すための?指定⼦が必要で、値の評価の際には、!演算⼦を必要とする。
これは、最終⾏のように 1 ⾏で記述することができる。
var line: String? = readLine( ) // オプショナル型
var optvalue: Int? = Int( line! ) // オプショナル型
let value = optvalue! // 解凍して評価
let value = Int( readLine( )! )! // 1 ⾏で同じ内容を記述

3.3 変数の省略と構⽂の句による修飾
switch ⽂では、case の変数にタプルとして値を受け取るが、その変数は参照しない場合、_（アンダーバー）変数による省略記法を⽤いることができる。for ⽂でのルー
プ変数の値を参照しない場合は、_変数を⽤いることができる。for ⽂の_変数は、Python でも使⽤可能である。また、制御⽂においては、オプショナル型の定数に代⼊が⾏なわれたかどうかを条件判定に⽤いることができ、オプショナル束縛と呼ばれている。加えて、条件判定の際に、where 句を⽤いて、条件に合致する際だけ、変数に束縛させることが可能になっている。これらの修飾句などのバリエーションにより、旧来の制御⽂に掛けた時間の 2 倍近く制御⽂の説明に時間を要した。
3.4 関数定義およびクロージャとジェネリック関数関数定義においては、Swift は悪しき Objective-C の属性を引き継いでいるため、関数の引数にタグをつけなければならないが、_（アンダーバー）による省略記法を⽤いて、そのタグを省略して実引数を指定することができる。
Pythonでは、逆にタグはキーワード引数としていて、その引数のデフォルト値を与えて、実引数を省略可能にするために⽤いられていて、こちらの⽅が使いやすい。
func square( x: Int ) -> Int { return x * x }// 呼出しは、square( x: 23 )のようにして呼び出す
func square(_ x: Int ) -> Int { return x * x }// 呼出しは、square( 23 )のようにして呼び出す

クロージャは、Python でいうところの無名関数として⾼階関数に対して引数として渡される関数であるが、Javaの無名メソッドのようにクロージャの中にいろいろ記述できることや、クロージャ⾃体への引数などの省略記法があり、プログラムの可読性を低くしている。また、戻り値がある場合でも、その記述の仕⽅に多くのバリエーションがあり、どの記述に遭遇しても同じ動作をすることをプログラムの読者は認識しなければならない。例えば、
names という⽂字列配列に対して降順に整列した配列を⽣成するために適⽤される sort( :by )⾼階関数に対して、以下のような省略形の記述をすることができる。

-144-

2020 PC Conferece

names.sorted(by: { (s1: String, s2: String) -> Bool in returns1 > s2 } ) // 省略無し
names.sorted(by: { (s1, s2) in return s1 > s2 } ) // 型推論による省略
names.sorted(by: { (s1, s2) in s1 > s2 } ) // return の省略
names.sorted(by: { $0 > $1 } ) // 簡略引数名の使⽤
names.sorted(by: > ) // ⽐較演算⼦だけの指定
ジェネリック関数は、C++/Java のテンプレートを引き継いだ形になっていて、複数の型に対して同じような処理を関数で⾏ないたいときに、T などの型名で型⾃体を引数にする⽅式である。下記の swapper 関数は引数に inout修飾⼦がついており、参照渡しになっており、2 つの引数の変数の値を交換するものである。呼出し時に型名が与えられていないが、型推論によって T には Int が代⼊される。また、参照渡しの&演算⼦が付けられている。
func swapper<T>(_ a: inout T, _ b: inout T ) {let temp = a; a = b; b = temp}var (x, y) = (12, 56)
swapper( &x, &y )4.

Python によるプログラミング教育との⽐較

Swift の基本的な⾔語構造は、Python と Java の中間的なもの、あるいはその両者の特⻑を取り込んだものになっているため、これまで両⽅のプログラミング⾔語を教えていた経験からは、基本構造の共通性から教えやすいものになっている。しかしながら、型指定が必要なコンパイル⾔語を基本としていること、省略記法の多さから、プログラミング初修者の学⽣にとっては⾮常に覚えにくい⾔語であると考えられる。
インタープリタは初等プログラミング教育に必須であり、Java のように簡単な計算結果を得るためだけに公開クラスを作成し、その中にクラスメソッドである main メソッドをシグネチャがあう形で定義しなければならないのは⾺⿅げている。簡単な例えば、「45 * 67」のような計算を⾏なうときに、インタープリタでは、その数式をそのまま記述すれば、計算結果を表⽰してくれる。Swift や Pythonのインタープリタでは、この当たり前の環境が実現されている。初等プログラミング教育では、このようなインタープリタの環境からプログラミングを始めるべきであり、前提となるクラス作成や main 関数などの定義などは、クラス・関数の概念を学んでから使うべきである。
クロージャの省略記法については、プログラミング初学者にとっては、プログラムの可読性を低くする効果しかない。⾏き過ぎた省略形は、記述されたプログラムへの理解を阻害する。ある⾃然⾔語について、⽅⾔を全部覚えておかないと⼝述された内容がまったく理解できないということと同じである。Python のように、⼀定の書き⽅で記述でき、記述の仕⽅のバリエーションを少なくする⽅が、プログラムの可読性はあがる。
Python は、タプル・⽂字列・リスト（配列）にスライス記法とインデックス記法が統⼀して使える。要素を持つ構造型のリテラルやデータに対して、同じ記法が使えるのは無駄のない⾔語設計と思える。また、これらの構造型のデータに適⽤されるジェネリック関数も、元々型指定をしない Python の扱いの⽅が優れている。Swift は、Javaや C++の多相形（テンプレート）を引摺っており、ジェネリック関数を型指定で宣⾔する必要があるのは不便であると感じる。

5.

おわりに

近年は、Rust などのコンパイル型プログラミング⾔語なども⼈気であるが、それは C/C++/Java ⾔語でプログ
ラミング基礎教育を受けて来た⼈達が先進的な要素が加わった⾔語として⽤いているのではないかと思われる。
Python, Go, Swift などは、インタープリタ型のプログラミング⾔語であるが、プログラミング基礎教育においては、1 ⾏からプログラムが記述できる、あるいは計算式による電卓機能を持ったインタープリタ型のプログラミング⾔語から始めるべきである。Python が全世界的に標準的なプログラミング基礎教育⾔語になっているのとは対照的に、Swift は所謂 Apple Computer 系のアプリケーシ
ョンを作るための⾔語として位置づけられているが、プログラミング基礎教育に使えなくもないことがわかった。
ただし、圧倒的なユーザ数を誇る Windows 上でも動くSwiftのインタープリタの開発が普及には必要と思われる。
Mac OS X 以外では、Ubuntu や Cent OS しか稼働しないので、他の Linux のディストリビューションも含め、Windows 10 でも動作する環境が構築されること、および今後は⾔語仕様が劇的に変化されないことをプログラミング教育者としては渇望している。

参考⽂献
(1)

(2)

(3)
(4)
(5)

-145-

Apple Computer：“The Swift Programming Language
Swift 5.0”，iBook，pp.1207（2019) same as swift.org：“The Swift Programming Language”，
https://docs.swift.org/swift-book/Apple Computer：“SwiftUI”,
https://developer.apple.com/documentation/swiftui(2019).
Apple Computer: “Xcode”,
https://developer.apple.com/xcode/ (2020).
Bare Bones Software: “BBEdit”,
http://www.barebones.com/products/bbedit/ (2020).
荻原剛志：“詳解 Swift 第 4 版”， pp.568, SB クリエイテ
ィブ, ISBN 978-4797395181（2017）．