『Swiftステップアップ』ReadingNotes_7

1753 ワード

汎用的な使用:
1:汎用コンストレイントによるリロード
extension Sequence where Iterator.Element: Equatable{
    func isSubset(of other: [Iterator.Element])->Bool{
        for element in self {
            guard other.contains(element) else {
                return false
            }
        }
        return true
    }
}

let one_three = [1,2,3]
let one_five = [1,2,3,4,5]
let a = one_three.isSubset(of: one_five)
print(a)//true

上記の使い方では、このシーケンスの要素が具体的にどのようなタイプなのかは気にしませんが、要素が等しくなるように要求されるので、Equatable汎用制約が与えられます.
2.閉パッケージを使用して動作をパラメータ化するには:
extension Sequence{
    func isSubSet(of other: S,euqalEvent:@escaping (Iterator.Element,S.Iterator.Element)->Bool)->Bool{
        for element in self{
            guard other.contains(where:{return euqalEvent(element,$0)}) else {
                return false
            }
        }
        return true
    }
}
print([[1,2]].isSubSet(of: [[1,2],[3,4]]){ $0 == $1 })


3.汎用データ型の作成、コード共通性の抽出
汎用的な作業方法:
各汎用タイプのパラメータについて、コンパイラは、値目撃テーブルと、タイプ上の各プロトコル制約のプロトコル目撃テーブルを含む一連の1つ以上の目撃テーブルを維持します.これらの目撃テーブル(vtableとも呼ばれる)は、実行時の関数を正しく実装するために動的に配布するために使用されます.任意の汎用タイプについては、メモリ申請を指し、これらのタイプをコピーして解放する基本的な操作ポインタを含む目撃表が常に存在します.これらの操作は、Intのようなタイプにとって、追加の操作は必要ないか、単純なメモリコピーだけである可能性があります.ただし、参照タイプでは、参照カウントの論理も含まれます.目撃表には、タイプのサイズと位置合わせも記録されています.プロトコル目撃テーブルは、マッピング関係のセットを提供し、このマッピングによって、汎用タイプが満たすプロトコル(コンパイラが汎用制約によってこの情報を静的に知ることができる)と、プロトコル機能に対する特定のタイプの実装(これは実行時にのみ知ることができる)との対応関係を知ることができる.実際には、ある値をクエリーしたり操作したりするには、目撃テーブルを使用します.
汎用最適化:汎用特化:
汎用特化とは、コンパイラが特定のパラメータパラメータタイプ(例えばInt)に従ってminのような汎用タイプまたは関数をコピーすることである.特化された関数は、Intを最適化し、追加のオーバーヘッドをすべて除去することができます.これは,配布のオーバーヘッドを排除するだけでなく,インラインのようなさらなる最適化を可能にする.従来の関数は非直接的に使用されていたため,これらの最適化は以前は実行できなかった.