iOS11アップデートについていくためのSwift入門(主観)
2017/09/20に、iOS11がリリースされました。今回のアップデートでは機械学習やSiriアプリ、ARなど様々な新機能が使えるようになりました。リンクを見ていて、「ちょっとSwift読めるようになっておかないと、おそらく半年くらいつまらなくなってしまう…上がってくるニュースを見ているだけになってしまう…」と思ったのがこの記事を書こうと思ったきっかけです。
リファレンスとしてはAppleのサイト、The Swift Programming Language (Swift 4): A Swift Tourを使います。学習の目的はSwiftのコード(主に今後発表されるであろう「iOS11で追加された〇〇を使って見た系の記事のコード」)を読めるようになることです。
Hello, world!
を目標、と思ったのですが、ベタ書きで終わってしまいました。
print("Hello, world!")
概要
リファレンスの内容は、Swiftを書き始めるのに十分な知識を得るためのツアーです。記事がSwiftのプロジェクトとしてまとめられていて、ダウンロードできるのでそれを使って学習していきます。
セクションは次のようになっています;
- Simple Values
- Control Flow
- Functions and Closures
- Objects and Classes
- Enumerations and Structures
- Protocols and Extensions
- Error Handling
- Generics
本記事ではリファレンス内に記載されている情報で、主に書き方に関することをメモしていきます。すでに序文の時点で以下の二点が記載されています;
- グローバルスコープの処理は勝手に実行されるので、エントリーポイントとしてのmain関数が必要ない
- 文末にセミコロンは必要ない
Simple Values
- 変数宣言について、定数は
let
、通常の変数はvar
で宣言する:var hoge = 1
とか。 - 明示的な型の宣言は
let piyo: Double = 70
(後置型宣言) \()
で文字列に変数を埋め込める。"template \()"
- 3ダブルクォート
"""
で複数行の文字列を囲むことができる - 配列リテラル
["hoge", "piyo",]
が使用可能 - [“hoge”: 1, “piyo”: 2]辞書も可能
- 空の辞書は
[:]
Control Flow
- if, switch, for-in, whileとかありますがこの辺は不思議なさそう
型?
でOptionalな変数を宣言できる(例var hoge: String? = "hoge"
)if let hoge = { ... }
でOptional変数から値を取り出すことができる、取り出すことができたらブロック内の処理を実行するという記法if var piyo = { ... }
ともかけるが、多分そんなに使わない- 取り出した変数のスコープはブロック内
- その他にOptional変数を扱う方法としては、
??
を使って、defaultValue ?? optionalValue
と言うように記述すると、値が取り出せる時のみ使用される switch
はcase
とdefault
で構成していきます。break
は不要、default
は必須です。0..<4
で、0,1,2,3の範囲のレンジを作成できる
Functions and Closures
- 関数定義は
func
、引数の定義はhoge: String
(後置型宣言)、アロー->
で戻り値の型を記述:func hoge(hoge: String) -> String { ... }
- 引数を名前付きで渡すことができる
hoge('fuga', piyo: 'giyo')
これは定義時にfunc hoge(_ hoge: String, piyo fuga: String)
と言うようにする。引数のラベル
と言うもので、_
はラベルなしを意味する。 - 高階関数も作れる:
(Int) -> Int
とかで型を宣言 - クロージャ使える:
{ (hoge: Int) -> Int in // クロージャの型と変数名 return hoge * 2 }
- 場合によっては型も省略できるらしいので、
{ hg in ... }
とかブラケットとin
が出てきたらクロージャとして読む。引数も$0, $1
と順番で記載されることがあるので、{ $0 < $1 }
とか書かれていても混乱しないように。
Objects and Classes
- クラスのインスタンス化は
ClassName()
- フィールドはベタ書きでいいが、外部からアクセスするには
getter
メソッドが必要 - イニシャライザー(コンストラクター)は
init
、クラス内のメソッドでインスタンス自身を参照するにはself
、デイニシャライザーはdeinit
- 継承は
class SubClass: SuperClass { ... }
setter
定義時のnewValue
パラメーターは予約語method?.hoge
でmethod
の戻り値があればhoge
を呼び出すと言うことができる
Enumerations and Structures
- enumはcaseで値を振っていく。ラベルから数値を取り出すのは
rawValue
、数値からラベルを作成するにはイニシャライザを使う(この時の値はOptional)。 - structで構造体を定義。だいたいの機能はクラスと同じだが、構造体は常に値渡しされる。
- class, struct, enumは似ている
Protocols and Extensions
protocol
でインタフェースのようなものが定義できる- メソッドに
mutating
宣言することで、インスタンスプロパティを変更するメソッドを定義できる(クラスの時は不要、struct,enumの時だけ) extension
で既存の型に機能拡張を行える、Protocolの機能を追加するのにも使える
Error Handling
do...catch
構文でかく、怪しいところにtry
をかくtry?
でOptional値を取り出す
Generics
- ジェネリクス
<Item>
で、Item
を変数のようにしようできる(数学でいう変数的な、x的な):var hoge = [Item]()
でItem
型の配列を宣言とか。 where
句もジェネリクス関連、親、子などの型の検証を記述できる
感想
以上、自分がSwift
を読む際に詰まりそうなところをまとめ終えました。逆に言えば詰まらなそうなところは、私の主観の範囲で無視しています。
Optional型の存在がちょっと気になりました。だいぶ面白そうです。またクラス、構造体、列挙型に関する扱いも違った見方を得られて興味深いです。自分としては列挙型はそこまで重要視していなかったのですが、Swift
をかくことでもっと本質をつかむことができるかもと、少し前のめりになりました。
iOS`界隈の盛り上がりに少しでもついていきたいと思った次第です。