210326 Fri


1.最初の学習内容:Generics


Generic codeでは、より柔軟で再利用可能な関数とタイプのコードを作成できます.
Generic code enables you to write flexible, reusable functions and types that can work with any type, subject to requirements that you define.

Generic Functions

import UIKit

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

var someInt = 3
var anotherInt = 107
print("스왑 전: someInt의 값은 \(someInt)이고, anotherInt의 값은 \(anotherInt)입니다.")
// 스왑 전: someInt의 값은 3이고, anotherInt의 값은 107입니다.
swap(&someInt, &anotherInt)
print("스왑 후: someInt의 값은 \(someInt)이고, anotherInt의 값은 \(anotherInt)입니다.")
// 스왑 후: someInt의 값은 107이고, anotherInt의 값은 3입니다.

var someString = "좋아합니다"
var anotherString = "귤을"
print("스왑 전: \(someString) \(anotherString)")
// 스왑 전: 좋아합니다 귤을
swap(&someString, &anotherString)
print("스왑 후: \(someString) \(anotherString)")
// 스왑 후: 귤을 좋아합니다
もし上記の例でジェニーンリックが使われていなかったら?Intが入る場合は交換関数を個別に作成する必要があり、Stringが入る場合は毎回交換関数を個別に作成する必要があるので面倒です😢

タイプパラメータ


JENERIC関数は、実際のタイプ名(Int、Stringなど)ではなく、プレースホルダ(上の関数ではT)を使用します.Placeholderはどんなタイプなのか教えてくれませんが、言ったようにどんなタイプなのか教えてあげます.すなわち,2つのパラメータPlaceholderタイプがTであるため,この2つのパラメータが同じタイプであることが分かる.Tの実際のタイプは,関数呼び出しの瞬間に決定される.

Generic Types


新価を出す
popping→collectionの終了値(スタック構造の一番上の値)が削除されます



import UIKit

struct Stack<Element> {
    var items = [Element]()
    mutating func push(_ item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
}

var stackOfStrings = Stack<String>()
stackOfStrings.push("uno")
stackOfStrings.push("dos")
stackOfStrings.push("tres")
stackOfStrings.push("cuatro")
print(stackOfStrings) //Stack<String>(items: ["uno", "dos", "tres", "cuatro"])

let fromTheTop = stackOfStrings.pop()
print(stackOfStrings) // Stack<String>(items: ["uno", "dos", "tres"])
スタックの上部の値がpopの後に消えているのが見えます.

タイプ制限

func substractTwoValue<T: BinaryInteger>(_ a: T, _ b: T) -> T {
    return a - b
}

substractTwoValue(10, 1) // 9
減算を行うには、減算演算子を使用する必要があります.
すなわち,Tが実際に許容できるタイプは減算演算子を用いることができるタイプでなければならない.
タイプパラメータTのタイプはBinaryIntegerプロトコルに適合するタイプに制限されるため、減算が可能となる.
このタイプ制限を使用すると、必要に応じて関数で実行する演算に基づいて適切なタイプを渡すことができます.

2.第2の学習内容:Subscripts

  • クラス、構造体、列挙タイプは、集合、リストシーケンスなどのタイプの要素にアクセスするショートカット構文である下付き文字を定義できます.
  • サブスクリプトは、個別のSetterやGetterなどの方法を実装することなく、インデックス設定や値のインポートを行うことができます.
    インデックスの値にe.g.someArrayというArrayインスタンスのインデックスでアクセスしたい場合はsomeArray[index]となり、someDictionaryというdictionaryキーでキーの値を取得したい場合はsubscriptsとなります.
    struct TimesTable {
        let multiplier: Int
        subscript(index: Int) -> Int {
            return multiplier * index
        }
    }
    let threeTimesTable = TimesTable(multiplier: 3)
    print("six times three is \(threeTimesTable[6])") //18
    資料の出所
  • swift公式文書https://docs.swift.org/swift-book/LanguageGuide2
  • https://jusung.gitbook.io/the-swift-language-guide/language-guide
  • SWIFT SWIFTプログラミング3版、野熊