概ねは質問者さんの考えている通りです。
まず、このタイプのwhereは型制約と呼ばれてるものです。
クラスに言及していますが、通常のクラスの場合は使用できません。
protocol extension以外でもGenericsな型宣言や関数にも使用可能です。
制約自体の文法は2種類あります。
1つ目はprotocolの準拠あるいは継承していることを制約とするもので提示の :
を使った文法です。
たとえば以下のstructA
のプロパティa
はEquatble
に準拠していることを要請しています。
swift
1struct A<T> where T: Equtable {
2 let a: T
3}
これは以下のように書かれているものと同等です。
swift
1struct A<T: Equatable> {
2 let a: T
3}
protocol extensionの場合はそれ自身の準拠の要請をする必要があるため、Self
が利用可能です。(Sは大文字です。)
swift
1extension Alertable where Self: UIViewController {
2 ...
3}
Swift5.0から上記のようにクラスを指定できるようになりました。
なお、protocol extensionでこの型制約を用いた場合、
swift
1extension Alertable where Self: UIViewController {
2
3 func toDoubleHeight() {
4 guard let frame = self.view?.frame else { return nil }
5 self.view.frame = CGRect(x: frame.x, y: frame.y, width: frame.width, height: frame.height * 2.0)
6 }
7}
のようにUIViewControllerでなければ利用可能ではないプロパティやメソッドが利用できるようになります。
2つ目は型が特定の場合であることを要請する文法です。==
を使います。
swift
1extension Array where Element == String {
2 func joined() {
3 return self.reduce("") { $0 + $1 }
4 }
5}
このように書くことでArray<String>にのみメソッドを増やすことが可能です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/07 12:23