Udemy:Swift基礎
こんばんは、小村だよ!
前回の記事で、下記2つのSwiftに関するUdemyの講座を受けることに決めました
どちらの口座にもSwiftの基礎のパートがあるので、今日はそこを見ていきます!
目次
- playgroundを実行する
- SwiftUI 超入門 セクション3 メモ
- みんなのiOS講座 セクション4 メモ
記録
playgroundを実行する
Swiftの動作を確認するときはこのplaygroundを使うのが一般的なようです
blankで開けば一番シンプルなソースなので、そちらを開きます
なんかエラー出てるんですけどぉ!!!原因不明て!!!
しょっぱなから詰まる気配がぷんぷんするぜ!!!
- では!Udemy見ながら触っていきましょう!!
SwiftUI 超入門 セクション3 みんなのiOS講座 セクション4 メモ
変数と定数
let: 定数
let a = 123
var: 変数
var b = 987
四則演算
- 割り算 int型同士は小数点以下が出ず余を出せる
- 小数点が混ざってると小数点以下も出る
文字列への変数の埋め込み方
文字はダブルクオートで囲む
バックスラッシュ+()で変数を文字に変更可能
"文字\(変数名)文字列"
比較演算
==
!=
&&
||
!
guard構文
- if文でもいけるが可読性があがる
guard variable == 10 else { 異常処理 return } 正常処理
オプショナル型
nil:何もないを表す(Nullとかと同じ意味ぽい)
ラップ:オプショナル型にすること
アンラップ:オプショナル型から既存の型を取り出す
正式な書き方
let 定数名: Optional<型> = 型に対応した値
シンタックスシュガー
let 定数名: 型? = 型に対応した値
強制的なアンラップ
Nilが確実に入っていないときにつかう
オプショナル変数!
オプショナルバインディング
- ifやguardでNilの処理を記述したうえでアンラップ
var a: Int = 123 var b: Double = 123 var c: Int? print(c) c = 456 c = nil c = 5 var d: Int? = 7 //let e = c + d let e = c! + d!
配列
空の配列の書き方
var emptyArray = [Int]()
var emptyArray: [Int] = []
辞書
- オプショナル型になるので取り出すときは最後に!をつける
var 辞書 = [ "aaa": "あああ" "iii": "いいい" ] print(辞書['iii']!)
- 空の辞書を作る
var 空辞書 = [キーの型: 値の型]()
for in
- 一定範囲の数字で繰り返すときの書き方
// 閉区間(1〜10出力) for i in 1...10 { print(i) } // 半開区間(1〜9出力) for i in 1..<10 { print(i) }
関数
func 関数名(引数: 引数の型) -> 戻り値の型 { return 戻り値 } print(関数名(引数名: 値))
クロージャ
- 名前のない関数(無名関数と同等っぽい)
let 定数 = {(引数: 引数の型) -> 戻り値の型 in 戻り値} print(クロージャが定義された定数(引数))
- 引数なし、戻り値なしの場合の書き方
let 定数 = {処理} 定数()
let getName{(name: String) -> String in return name + "さん" } func sayName(name, closure: (name: String) -> String ) { print(closure(name)) }
クラス
インスタンスプロパティ/メソッドと型プロパティ/メソッドがある
型〜〜はインスタンス化しなくてもアクセスできる
インスタンスと型のどちらを使用するかは場合による
イニシャライザは頭にfuncをつけなくて良い
クラスへ変数を渡すと参照渡し
static var 型プロパティ名 static func 型メソッド名() { }
class ClassName { var property1: Int func Function1() { print("property1 = \(property1)") } init(property1: Int) { self.property1 = property1 } } var instance = ClassName(property1: 1) instance.Function1()
構造体
値をまとめるもの
構造体は配列にすることができる
構造体は宣言時にプロパティに値を入れることが可能(クラスのinitを書く必要なし)
構造体へ変数を渡すと値渡し
データの保持のみのときは構造体、それ以外はクラスなどと使い分ける
struct StructName { var property1: Int func Function1() { print("property1 = \(property1)") } init(property1: Int) { self.property1 = property1 } } var instance = StructName(property1: 1) instance.Function1() var instances: [StructName] = [ StructName(property1: 1), StructName(property1: 2), StructName(property1: 3), StructName(property1: 4), ] instances[3].Function1()
プロトコル
実装を保証する
定義したプロパティやメソッドは必ず実装しなければならない
protocol ProtocolName { var letvalue: Int {get} var varvalue: Int {get set} func method() } struct StructName: ProtocolName { let letvalue = 1 var varvalue = 2 func method(){ print("letvalue:\(letvalue), varvalue:\(varvalue)") } } var instance = StructName() instance.method()
do-catch
エラーをキャッチ
エラーを吐くかもしれない関数はthrowをつける
エラーを吐くかもしれない関数を使うときはtryをつける
import Foundation var Flg = false func method() throws { if Flg { print("OK") } else { throw NSError() } } func getData() { do { try method() print("AllOK") } catch { print("Error") } } getData()
継承
- クラスのみで構造体には使えない。へーーー
class クラス名: 継承元クラス名{ }
as
型変換をできる
アップキャスト、ダウンキャストがある
ダウンキャストは失敗することがある
as!は絶対失敗しないときのダウンキャストとして使う
as?は失敗するときにnilが変える
列挙型
- Switchなどをつかうとき便利。条件分岐が綺麗に纏まる
enum Signal { case Blue case Yellow case Red } var sig: Signal sig = Signal.Blue sig = .Blue switch sig{ case .Blue: print("Go") case .Yellow: print("Coution") default: print("stop") }
参照渡しと値渡し
数字や文字は値渡し
構造体は値渡し
クラスは参照渡し
デリゲート
理解できなかったので後回しにする……
正直説明が不足していると思う。なんとなくふわっとわかったけど言語化は無理
終わりに
一通り基礎構文については理解できたんじゃないかな
デリゲートはちょっと実践で使ってからまた戻ってきます
それ以外で知らなかった概念はオプショナル型くらいかな
これは何回もエラー出しながら覚えていくことになりそうです
次から本格的にアプリ作成に着手できるな!!!
ではでは今回はこの辺で、ちゃお〜〜〜!