【開発iOS5】Swiftの基本構文(保存用)
概要
木を見て森を見ず
にならないように、基本的な構文のみ。
他にもたくさんあると思うけど、まずは一番基本的なモノのみかな💦
使えそうなら参考にしてみてね〜〜〜〜〜。
変数
⒈用途:
処理の途中で他の値に変更できる引数を利用したい時に使う。
⒉構文:
var 変数名 【: 型】= 値
・【】内は省略できる。
定数
⒈用途:
処理の途中で値の変更を許さない引数を利用したい時に使う。
(例)消費税率みたいな決まりきった数字など。
⒉構文:
let 定数名 【: 型】 = 値
・【】内は省略できる。
if文
⒈用途:
(あまり条件分岐が多くなく)条件によって処理を変えたい時に使う。
⒉構文:
if 条件 {
処理...
}
【以下は省略可能】
else if 条件 {
処理...
}
else {
処理...
}
三項演算子
⒈用途:
if文と基本的にやることは同じだが、改行をせずに書きたい時に使う。
⒉例:
引数 = 条件式 ? 真 : 偽
switch文
⒈用途:
条件分岐が多く、条件ごとに処理を変えたい時に使う。
(例)「月曜日はこれをする、火曜日はこれをする。水曜日は、、、。」
⒉構文:
switch 式 {
case ラベル1:
処理...
default:
処理...
}
while文
⒈用途:
条件を満たす間は、処理を繰り返したい時に使う。
⒉構文:
while 条件 {
処理...
}
repeat-while文
⒈用途:
コードブロック内の処理を必ず1度実行してから、条件を満たす間は、処理を繰り返したい時に使う。
⒉構文:
repeat {
処理...
}while 条件式
for-in文
⒈用途:
指定した回数分だけ処理を繰り返したい時に使う。
⒉構文:
for 回数 in 式 【where 式】 { //【】は省略可能
処理...
}
/*
式
..< 指定した後ろの数を含まない回数繰り返す場合
... 指定した後ろの数を含む回数繰り返す場合
(例)
for i in 0 ..< 10 {
print(i)
}
for i in 0 ... 10 {
print(i)
}
*/
ラベル付きloop文
⒈用途:
一定の条件を満たす処理が終わったら、ラベルの処理に抜け出したい時に使う。
⒉構文:
loop1: while 条件{
loop2:while 条件{
while 条件 {
break loop1
continue loop1
break loop2
continue loop2
}
}
}
do文
⒈用途:
ある範囲でのみ有効な変数を使う目的でコードブロックを利用したい時に使う。
⒉構文:
do {
処理...
}
関数
⒈用途:
処理の途中に別の処理を間に挟みたい時に使う。
(例)別の処理を呼び出して、その計算結果を返すなど。
⒉構文:
func 関数名【仮引数: 型 -> 型】 {
処理...
}
//【】は省略可能。
タプル
⒈用途:
複数の値をまとめて返したい時に使う。
⒉構文:
let 定数名 = (値1,値2,値3,...)
var 変数名 = (値1,値2,値3,...)
配列
⒈用途:
複数の要素をひとつのかたまりとして管理したい時に使う。
⒉構文:
let 配列名 = [要素1,要素2,...]
var 配列名 = [要素1,要素2,...]
辞書
⒈用途:
キーと値で管理したい時に使う。
*要素にキーが加わるので配列よりもより詳細な管理ができる。
⒉構文:
let 定数名 = [キー1:値1,キー2:値2,...]
var 変数名 = [キー1:値1,キー2:値2,...]
構造体
⒈用途:
プログラム内のどこか1箇所から参照される値型のデータを作りたい時に使う。
⒉構文:
struct 型名 {
変数/定数
イニシャライザ(構造体の初期値)
メソッド
型
プロパティ
添字付け
//など上記で定義したいものだけ記述
}
計算型プロパティ
⒈用途:
値の参照と更新をするプロパティを利用したい時に使う。
⇄格納プロパティ:定数や変数が機能を提供するプロパティ
⒉構文:
var プロパティ名 : 型 {
get {
プロパティの値を返す処理
}
set(仮引数){
プロパティの値を更新する処理
}
}
//*setとgetは順番問わない。setは省略可。setなしの場合はget{}すら省略可。
プロパティオブザーバ(property observer)
⒈用途:
更新をきっかけに、格納型プロパティの値の手続きを起動させたい時に使う。
・「値が格納される直前に呼び出される手続き」
・「値が格納された直後に呼び出される手続き」
の2つかどちらか一方
⒉構文:
var プロパティ名 ; 型 = 初期値{
willSet (仮引数){
値が変更される直前に呼び出される処理
}
didSet(仮引数){
値が変更された直後に呼び出される処理
}
}
//*初期値と仮引数は省略可。willSetとdidSetは順序を問わない。
添字付け(subscript)
⒈用途:
複数のプロパティのうち、特定のプロパティにアクセスしたい時に添字を使う。
⒉構文:
subscript (仮引数) -> 型 {
get{
添字で指定したプロパティの値を返す処理
}
set(仮引数) { //仮引数は省略可。
プロパティの値を更新する処理
}
}
//*set{}自体省略可。setなければget{}自体省略して、処理だけも可。
オプショナル型
⒈用途:
値がない=nil(他の言語のnullに相当)を許容したい時に使う。
⒉構文:
引数: 型? = 値
アンラップ
⒈用途:
オプショナル型になった値を利用したい時に使う。
⒉構文:
オプショナル型の引数!
guard文
⒈用途:
想定外の状況が発生した場合に、処理から抜け出したい時に使う。
guardを使わないオプショナル束縛(if-let)構文もある。
⒉構文:
guard 条件 else {
break
/*
(またはreturn,throw,
制御が戻らないことがわかっている関数やメソッドの呼び出し(=Never関数))
*/
}
*else節の記述必須。
*実行コードから抜け出す効果のある文を何かしら記述必須。
プロトコル
⒈用途:
抽象化されたメソッドやプロパティを宣言したい時に使う。
*JavaのインターフェースやVBAのクラスモジュールみたいなイメージかな?
⒉構文:
protocol プロトコル名 【: プロトコル名】 {
【static】func メソッド名(【仮引数列】) 【-> 型】
【static】var プロパティ名: 型 { get 【set】 }
static 【演算子種別】func 演算子(仮引数列) -> 型
init (【仮引数列】)
subscript(仮引数列) -> 型{ get set }
typealias 型名 = 型
associatedtype 演算子
}
*【】は省略可能。順番や個数に制限はない
*演算子種別を使うときは、prefixかpostfix
列挙型
⒈用途:
特定の値をまとめて宣言し、使い分けたい時に使う。
・値型
・共有型
がある。
⒉構文:
・値型:全ケースが同じデータ型のなんらかの値を持つ
値の型 = 実体型
ケース名 = 実体値
enum 型名: 実体型 {
case ケース名 【= リテラル】
case ケース名 【= リテラル】
}
//*【】は省略できる。
・共有型:各caseが異なる構造を持ち、インスタンスごとに値を変えられる
enum 型名 {
case ケース名【タプル型宣言】
case ケース名【タプル型宣言】
}
//*【】は省略できる。
クラス
⒈用途:
システムを構築する構造や、役割を与えられて動作する機能を利用したい時に使う。
⇄構造体:ひとまとまりの意味のあるデータを利用したい時に使う。
⒉構文:
class 型名【 : スーパークラス{
【変数/定数】
【イニシャライザ】
【メソッド】
【型】
【プロパティ】
【添字付け】
//*【】は省略できる
}
ダウンキャスト
⒈用途:
抽象度の高い型からより具体的な型への型変換を行いたい時に使う。
スーパークラスの型を持って振る舞うサブクラスのインスタンスに、サブクラスとしての型を与えて、その定義の下での動作を許す。
⒉構文:
as スーパークラス名
//as?やas!もある
クラスの継承
⒈用途:
スーパークラスの振る舞いを利用したい別のクラスで利用したい時に使う。
⒉構文:
class 継承するクラス名: 継承されるクラス名 {
処理...
}
指定イニシャライザ
⒈用途:
そのイニシャライザを使うだけでインスタンスの初期化全て完了できる時に使う。
convenienceを付けない
⒉構文:
init(仮引数列){
処理...
}
簡易イニシャライザ
⒈用途:
他のイニシャライザを呼び出して、その助けを借りることで初期化を行う(=デリゲート)時に使う。
convenienceを付ける
⒉構文:
convenience init(仮引数列){
処理...
}
必須イニシャライザ
⒈用途:
スーパークラスにもサブクラスにも確実に存在するイニシャライザを明示する時に使う。
requiredを付ける。
⒉構文:
required init() {
処理...
}
required convenience init() {
処理...
}
添字付けの継承
⒈用途:
添字付けの定義も上書きしたい時に使う。
⒉構文:
super[添字]
デイニシャライザ
⒈用途:
インスタンスが削除される直前に何らかの処理を実行したい時に使う。
⒉構文:
deinit {
処理...
}
エクステンション
⒈用途:
すでに存在する型に新しいメソッドやプロパティを追加したい時に使う。
⒉構文:
extension 型名: 【プロトコル列】{
【イニシャライザ】
【計算型プロパティ】
【メソッド】
【その他】
}
//*【】はオプション。定義の個数、順序は自由
do-catch構文
⒈用途:
起きるエラー発生条件を予め手続き化しておいて、どのエラーにも対応できるようにしておく時に使う。
⒉構文:
do {
【処理...】
} catch 【パターン】【where節】{
【処理...】
} catch {
【処理...】
}
try?とtry!
*do-catch構文と組み合わせられない。
・try?:返り値がオプショナル型になる。
エラーが発生=nil、エラーが発生しない=通常の返り値
・try!:エラーが発生しない限り通常の関数と同じ扱いにできる。
エラーが発生するとプログラムが止まるから、通常は、エラーがないことが確実な時以外使わない。
defer文
⒈用途:
起きるエラー発生条件を予め手続き化しておいて、どのエラーにも対応できるようにしておく時に使う。
⒉構文:
defer {
処理...
}
assert
⒈用途:
検証、デバッグ用の機能。プログラムの動作を確認したい部分に記述し、正しく動作するための条件を記述したい時に使う。
・条件が満たされている→何もしない。
・条件が満たされなかった→処理を停止、停止箇所に関する情報とメッセージを実行ログに記載。
⒉構文:
assert()
@available属性
⒈用途:
対応バージョンを示す時に使う。
⒉構文:
@available(OS名, 追加情報)
/*
・OS名
iOS
macOS
watchOS
tvOS
・追加情報
unavailable 利用不可
deprecated:バージョン 非推奨になるバージョン
obsoleted:バージョン 廃止されるバージョン
introduced:バージョン 導入されたバージョン
message:文字列 警告メッセージに含める文字列
renamed:文字列 変更後の名称を示す文字列
など。
*/
条件付きコンパイル
⒈用途:
コンパイルの対象とする部分とそうでない部分を指定したい時に使う。
⒉構文:
# if 条件
処理
# elseif 条件
処理 *オプション
# else
処理 *オプション
# endif
モジュールのインポート
⒈用途:
標準ライブラリ(API)の機能を利用したい時に使う。
⒉構文:
import モジュール名
クロージャ
⒈用途:
変数や引数に関数の中身を直接代入したい時に使う。
⒉構文:
{
【[キャプチャリスト]】(仮引数: 型, ...) 仮引数, ... 【-> 型】in
処理...
}
*【】は省略できる。
*いずれかの形式で指定
・引数の型を指定する場合:仮引数は0個以上
・引数の型を省略する場合:仮引数は1個以上
*引数、結果の型を両方省略もできる
*キャプチャリスト、または仮引数を指定した場合、inは必須。
他の言語やってる人だと、この記事もイメージ湧きやすいかも。
久しぶりに本読んでも
「ん?ラムダ式とかアロー関数と違うのか?」が率直な疑問だった💦
ジェネリクス
⒈用途:
型制約を柔軟にしたい時に使う。
⒉構文:
func 名前 <T:【プロトコル】> (仮引数列) -> 返り値の型 【where 条件】{
処理...
}
subscript <T:【プロトコル】> (仮引数列) -> 返り値の型 【where 条件】{
処理...
}
struct 名前 <T:【プロトコル】> 【where 条件】{
処理...
}
extension 名前 【where 条件】{
処理...
}
参考文献
この本は情報が深すぎるから、
この記事では一番、基本となる構文のみをまとめてます。
サンプルコードは
ツェラーの公式とかフィボナッチ数列みたいな数学に馴染みのない人にはイメージが湧きにくいものが多かったので、
で身近な=イメージの湧きやすいサンプルと解説を扱ったリンク先を各構文ごとに付けてる。
そちらも見てみてね💦
ちなみに、
たしか数年前、iOSの勉強し始めた時に初めて買って途中で挫折した書籍だけど、
でまとめたような「作る系」の本で、iOSの公開までは独学でできた。
・学ぶ目的
・習熟度
に合わせて、本は選ぼう!!!!!!!
まとめ
💃何かでつまづいた時に二度とこの本を読まなくても、
すぐに振り返れる一覧が欲しかったので、記事にした次第🕺
所感
SwiftでiOSアプリ制作に入った時に、すぐに検索できるように、
本文の内容については、サンプルコードから付録の内容などをまとめておきたかったので、自分なりに3週間くらいかけて、
な感じでまとめた感じ。
ここまでテキストに起こして、iCloudに放り込んでおけば、
PagesからPDFに書き出しも簡単だからね〜〜〜〜✨