210326 Fri
12831 ワード
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
インデックスの値に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
資料の出所Reference
この問題について(210326 Fri), 我々は、より多くの情報をここで見つけました https://velog.io/@sunnywhynot/210326-Friテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol