Udemy:Swift基礎

  • こんばんは、小村だよ!

  • 前回の記事で、下記2つのSwiftに関するUdemyの講座を受けることに決めました

    • iOS】SwiftUI 超入門 - Swift を基礎から学んで iOS (iPhone) アプリを開発しよう

      • 以降、SwiftUI 超入門と呼びます
    • みんなのiOS講座 ゼロからSwiftで学ぶiPhoneアプリ開発の基礎

      • 以降、みんなのiOS講座と呼びます
  • どちらの口座にもSwiftの基礎のパートがあるので、今日はそこを見ていきます!



目次

  1. playgroundを実行する
  2. SwiftUI 超入門 セクション3 メモ
  3. みんなのiOS講座 セクション4 メモ



記録

playgroundを実行する

f:id:kom314_prog:20210925145417p:plain
  • Swiftの動作を確認するときはこのplaygroundを使うのが一般的なようです

  • blankで開けば一番シンプルなソースなので、そちらを開きます


f:id:kom314_prog:20210925145631p:plain
f:id:kom314_prog:20210925145848p:plain
  • なんかエラー出てるんですけどぉ!!!原因不明て!!!

  • しょっぱなから詰まる気配がぷんぷんするぜ!!!



f:id:kom314_prog:20210925151946p:plain
  • 再起動したら直りました!!!あるあるあるある!!!

  • でかいものインストールしたら再起動が安定はWindowsMacも共通みたいです



  • では!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")
}


参照渡しと値渡し

  • 数字や文字は値渡し

  • 構造体は値渡し

  • クラスは参照渡し


デリゲート

  • 理解できなかったので後回しにする……

  • 正直説明が不足していると思う。なんとなくふわっとわかったけど言語化は無理


終わりに

  • 一通り基礎構文については理解できたんじゃないかな

  • デリゲートはちょっと実践で使ってからまた戻ってきます

  • それ以外で知らなかった概念はオプショナル型くらいかな

  • これは何回もエラー出しながら覚えていくことになりそうです

  • 次から本格的にアプリ作成に着手できるな!!!

  • ではでは今回はこの辺で、ちゃお〜〜〜!