プログラミング

Swiftを触ったことがないプログラマーのためのSwiftチュートリアル

Swiftを触ったことがないプログラマーのためのSwiftチュートリアル

はじめに

前回も似たような記事を書きました.

  1. 他プログラミング言語を普段使う人のための日本語版SwiftUIチュートリアル

が,今回はSwift特化版です.

前回の記事では,SwiftUIチュートリアルを進めながら,各所に突っ込みを入れていたのですが,やはりSwift自身の基本知識がある程度必要だと感じました.

そこで今回の記事です.

この記事は言うなれば,SwiftUIで快適にアプリ開発を行うためのSwiftチュートリアルと言ったところです.

また,JavaやPython,C++などの他プログラミング言語をすでに学んでいる人向けの解説なので,やや中級者向けかもしれません.

「へえ,Swiftの構文ってこうなのか...」みたいな感じで流し読みしてくれると嬉しいです.

それでは始めます.

あ,ちなみに本記事はSwift 5です.

Swift 2やSwift 3などとは構文がやや違う場合もあります.

Swiftを触ったことがないプログラマーのためのSwiftチュートリアル

Xcode立ち上げ

XcodeはSwift特化のIDEですが,アプリ開発以外にも,もちろん簡単なSwiftプログラミングにも利用できます.

Swiftを触ったことがないプログラマーのためのSwiftチュートリアル

Get started with a playground > Blank でプロジェクトを作成しましょう.

そうすると,ほとんど真っ新なコードが出てきます.

まずはこれを全て消して,本当に真っ新にしてスタートです.

変数定義

基本からいきますよ.

Swiftでは変数定義は,後置型付け

省略可能らしいが,Pythonなどと比べ型の決まりは厳しいらしいので,付けといたほうが無難.

標準出力

これはPythonと似ている使い方.

ただ,与える引数名と,関数への明示的な引数の与え方に注意.(Pythonなどとは異なる)

if文

条件分岐の基本.

使い方は,C++とPythonの間って感じ.

条件式に括弧はいらないけど,スコープの { } は必要だし, else if はPythonのような elif という形ではない.

if文 (三項演算子)

Swiftでももちろん三項演算子が使えます.

先ほどのコードを短くすると以下のようになります.

いやー,簡潔でいいですね!

ただ注意として,条件式のあとにスペースを入れて ? を書く必要があります

switch文

条件分岐の基本その2.

Swiftのswitch文は多機能で使い勝手が良いです.

まずは基本的な構文.

break はなくても,基本的にbreakしてくれる.

そして,なんといっても便利なのは以下のような使い方.

条件式として,範囲演算子 ( ... ) が使用できます.

範囲演算子って,Rubyの影響受けてそうだよね.

for文

SwiftではPythonのような範囲for文です.

もちろん,後に紹介する配列も同じように回せます.

また,等差数列的な回し方も可能です.(for文の説明では無いが...)

while文

これも,特筆すべきところはないので,コードを見て理解して欲しい.

と,少し名前が特殊なだけ.


関数

Swiftにおける関数定義は,以下のようになります.

このとき, capacity: はラベルと呼ぶらしく,引数を渡すときにはこのラベルが必要です.

戻り値がある場合, -> String のように指定します

また,

のように,動的に引数をとることも可能です.

そして戻り値はタプルも可です.

ここで,以下のように戻り値にラベルをつけることもできます.

クロージャ

Swiftでよく出てくるのがクロージャ.

無名関数とも言う.

これでもかってくらい,クロージャを多用してくる,超重要構文.

特に,関数の引数としてクロージャを渡す,という形が多い.

まあ,クロージャ自体は他の言語でもあるんだけどね.

基本的な使い方は以下のような感じ.

そしてこのクロージャ,省略しようと思えばかなり省略できてしまう

まず,処理部が一文の場合, return 省略のほかに,戻り値の型も省略ができる.

また,予め型の宣言をしていれば,初期化の際には型の明記は不要になる.

さらに,引数名にこだわりがなければ, $0, $1, ... で代替可能である.

これが一番省略されたクロージャ.(Swiftっぽくなってきた)

よく関数の引数でこういうクロージャが渡されているのをSwiftではよく見る.

多分,この後も出てきます.

配列: 前編

Swiftの配列は定義は普通だけど,扱いに少しだけ癖がある.(ように感じる)

そう,定義は至って普通.

ここで,配列に対して最大値と最小値を見つける場合はどうすれば良いかと言うと,こうします.

なんら不思議なことはありませんが,出力を見ると,

Optional() というものに包まれて返ってきたようです.

しかも,XcodeはなにやらWarningも出しています.

話は逸れますが,この Optional 型について先に簡単に説明します.

Optional型

Optional 型は一言で言い表すならば「nilを許容する変数」です.

nilは他言語のnullと同義で,何もデータがない状態を指しています.

本当はもっと奥が深いのですが,ここでは簡単にコードとコメントだけで解説します.

結構ややこしいのですが,これだけでだいぶOptional型の扱いは分かるかと思います.

さっきほどの最小値・最大値も,何かしらの手法でアンラップしてあげれば良いということになりますね.

詳しくは以下の記事で解説されているので,余力のある人は見てみると良いかも.

  1. どこよりも分かりやすいSwiftの"?"と"!" - Qiita

配列: 後編

さて,配列に戻ってきました.

最小値・最大値は良いとして,次に紹介するのはモデルとかでよく使いそうな,データ抽出です.

例えば以下のような操作.

このようにSQLのような操作をサポートしています.

他にも,

のように,完全一致のケースも可能です.

どちらかといと, (where: ) の方が,引数にクロージャを与える形なので汎用性は高そうです.

もっと実用的な使い方は,この後の後で紹介する構造体で説明します.


プロトコル (protocol)

プロトコルは,PHPなどでいうインターフェース的な働きをします.

言い換えれば,仕様書のようなもので,Swiftではクラスベースというより,プロトコルベースの開発が基本なようです.

さて,早速何か定義してみます.

仕様書なので,何か決まった値が必ずしも入るわけではありません.

あくまで,これを継承する構造体やクラスの実装を容易にするためのものです.

今,自分で適当にプロトコルを実装してみましたがSwiftUIでは便利なプロトコルがたくさんあるので,それらを使って構造体やクラスを設計する形がほとんどになるかと思います.

Swiftだと,プロトコルを上手く使いこなせる人こそ真のSwifterなのかな,知らんけど.

構造体 (struct)

これ以上継承しないクラス.

参照型ではないクラス.

といったところでしょうか.

さっき作成したプロトコルを継承して実装してみましょう.

プロトコルと構造体でのメソッド定義で,自身のプロパティを使って計算をするならば, mutating func として定義しなければならない.

面倒臭いですね.

そしてここで,2つのプロパティが登場します.

ストアドプロパティ (Stored Propaty)とコンピューテッドプロパティ (Computed Propaty) です.(カタカナ英語だとダサいね,英語で表記します.)

Stored Propatyとはいわゆる値やデータを保持する普通のプロパティです.

一方でComputed Propatyはクロージャのように,動的なものを扱って都度出力を計算するプロパティです.

ただ,クロージャはStored Propatyで一度しか呼ばれないので,根本的に違うものです.

「じゃあいつ使うんだ」と思うかもしれませんが,例えば他のStored Propatyを引数とする関数の戻り値を使う場合はComputed Propatyが使えます.

さてここで,この構造体を複数持った配列の扱いについて見ていきます.

先ほど,配列の操作の仕方を解説したので,おそらく以下のコードが理解できるはずです.

まあ,意味のないコードですが,許してください.

ここで, $0 が operations: [Addition] = [op1, op2, op3] の各要素 (インスタンス) を表していることが分かります.

なので, {$0.num == 0} のような使い方ができるのです.

クラス (class)

次にクラス.

基本的には構造体とあまり変わらないが,違うといえば違う.

まずは,先の構造体と同じものをクラスに書き換えてみます.

このように,ほとんど同じにかけるけれど,構造体と違って mutating は必要なし.

また,クラスは参照型なので以下のような扱い方ができる.

これは,構造体だと参照型ではないのでエラー.

あと,もちろん private などのアクセス修飾子も付けることができます.

アクセス修飾子が多い.

使い分けが難しいが, private と fileprivate あたりを使いこなせれば良いのでは,とも思う.

おわりに

長かった...

最後まで読んでくれてありがとうございます.

これで,Swiftに入門は出来たのでは無いでしょうか.

みなさんもこれを機にSwiftを私と一緒に始めませんか?

今度, Swiftの構造体についてもっと詳しく調べたいなあ (願望)

👉 Swiftでのアプリ開発を学ぶなら


スポンサードリンク