サイトアイコン 上尾市のWEBプログラマーによるブログ

「たった1日で基本が身に付く! Swift アプリ開発 超入門」の感想・備忘録2

「たった1日で基本が身に付く! Swift アプリ開発 超入門」の感想・忘備録1の続き

辞書(Dictionary)

宣言&初期化

var 変数 = [キー1: 値1, キー2: 値2]

キー指定で要素削除

変数.removeValue(forKey: キー)

全要素削除

変数.removeAll()

// 宣言&初期化
var dic = ["spple": 200, "lemmon": 500, "orange": 350]

// キー指定で要素削除
dic.removeValue(forKey: "lemmon")
print(dic) // ["orange": 350, "spple": 200]

// 全要素削除
dic.removeAll()
print(dic) // [:]

関数

関数定義

func 関数名(引数1: データ型, 引数2: データ型) -> 戻り値の型 {
    // 処理
}

func add(num1: Int, num2: Int) -> Int {
  return num1 + num2
}
print(add(num1:3, num2:4)) // 7

関数ラベル

引数名を省略して呼び出せるようにする場合は、引数名の前に「_ 」を置く。
func 関数名(_ 引数1: データ型, _ 引数2: データ型) -> 戻り値の型 {
    // 処理
}

func add(_ num1: Int, _ num2: Int) -> Int {
  return num1 + num2
}
print(add(3, 4))

厳密には、関数の引数には引数名の他に分かりやすいラベル(関数ラベル)をつけることができる。
※関数ラベルをアンダースコアにすると省略可能となる

func add(a num1: Int, b num2: Int) -> Int {
  return num1 + num2
}
print(add(a:3, b:4))

guard文

guard文とは

条件式がfalseの場合に関数から抜けるための構文。
if文でも同じ処理を書くことができるが、可読性が上がるのでguard文を使うべき。
guard 条件式 else {
    // 処理
    return または break または throw
}
※elseブロックの中にreturn、break、throwのいずれかを記述しないとエラーになる

func hoge(_ num: Int)->Int {
    guard num > 100 else {
        return 100
    }
    return num
}
print(hoge(500)) // 100

オプショナルバインディング

オプショナル型の変数をアンラップする際に、以下の形のguard文がよく使われれる。
guard文を使うことでnilチェックとアンラップを同時に行うことができる。
guard let 変数 = オプショナル else {
    // nilだった場合の処理
    return または break または throw
}

func hoge(_ num: Int?)->Int {
    guard let num2 = num else {
        return 0
    }
    return num2
}
print(hoge(nil)) // 0

defer文

関数(厳密言うとスコープ)を抜ける前に必ず実行したい処理を定義することができる。
defer {
    // 処理
}
※defer文の前にbreakやreturnなどで処理を抜けてしまうと実行されないの注意

func hoge(_ num: Int)->Int {
    defer {
        print("hoge終了")
    }
    guard num <= 100 else {
        return 0
    }
    return num
}
print(hoge(100)) // hoge終了 100
print(hoge(101)) // hoge終了 0

クラス

クラスの定義

class クラス名 {
    // プロパティの定義
    // イニシャライザの定義
    // メソッドの定義
}

※イニシャライザの定義は「名前がinitでfuncキーワードと戻り値を記述しない」関数の定義
※プロパティやメソッドへのアクセスはself.プロパティ名、self.メソッド名()

インスタンス化

var 変数 = クラス名()

class Person {
    var name = ""
    init(name: String) {
        self.name = name
    }
    func getName() -> String {
        return self.name
    }
}

var person = Person(name: "hoge")
print(person.getName()) // hoge
print(type(of: person)) // Person

オーバーロード

他のプログラミング言語と同じように、関数やイニシャライザはオーバーロードすることができる。

class Person {
    var name = ""
    init() {
        self.name = "no name"
    }
    init(name: String) {
        self.name = name
    }
    func getName() -> String {
        return self.name
    }
}

var person = Person()
print(person1.getName()) // no name

計算型プロパティ(Computed Properties)

値を保持せずに、他のプロパティからの計算によって値を取得・設定するプロパティ。

var プロパティ名: データ型 {
    get {
        // 処理
    }
    set {
        // 処理
    }
}

※set内ではnewVlaueという名前の変数から値を取得することができる
※letで宣言した変数にインスタンスを代入すると、セッターによる値の代入ができなくなるので注意

class Person {
    var _name = ""
    var name: String {
        get {
            if (self._name == "") {
                return "名無し"
            }
            return self._name
        }
        set {
            self._name = newValue
        }
    }
}

var person = Person()
print(person.name) // 名無し
person.name = "hoge"
print(person.name) // hoge

プロパティ監視

値設定の前後に行う処理を定義することができる。
計算型プロパティは値を保持しないが、プロパティ監視は値を保持する。

var プロパティ名: データ型 = 初期値 {
    willSet {
        // 処理
    }
    didSet {
        // 処理
    }
}

※willSet内ではnewVlaueという名前の変数から値を取得することができる
※didSet内ではoldVlaueという名前の変数から値を取得することができる
※イニシャライザからの変更時はプロパティ監視は呼び出されない

class Person {
    var name: String = "" {
        willSet {
            print("willSet from:\(self.name) to:\(newValue)")
        }
        didSet {
            print("didSet from:\(oldValue) to:\(self.name)")
        }
    }
    init(name: String) {
        self.name = name
    }
}

var person = Person(name: "hoge")
print(person.name) // hoge
person.name = "hoge2" // willSet from:hoge to:hoge2\n didSet from:hoge to:hoge2
print(person.name) // hoge2

継承

class クラス名:親クラス名 {
    // クラス定義
}

※関数やイニシャライザをオーバーライドする場合はoverrideキーワード付ける

class Oya {
    var num = 1
}
class Ko:Oya {
    override init() {
        super.init()
        print(self.num)
    }
    init(num: Int) {
        super.init()
        self.num = num
        print(self.num)
    }
}
var ko = Ko()
var ko2 = Ko(num:2)
モバイルバージョンを終了