Swift のプロトコルエラー: 'weak' は非クラス型に適用できない
質問
プロトコルとクラスバインドプロトコルの違い、Swiftで使うべきはどちらでしょうか?
protocol A : class { ... }
protocol A { ... }
を追加しようとすると、エラーが発生します。
weak
として定義されていない場合に、デリゲートを追加しようとするとエラーが発生します。
: class
:
protocol A { ... }
weak var delegate: A
エラーを表示します。
'weak' は非クラス型に適用できません。
または
'weak' はクラスバウンドしない 'A' に適用してはいけません。クラスバウンドするプロトコル適合性を追加することを検討してください。
どのように解決するのですか?
Swift >= 4:
protocol A : AnyObject { ... {
Swift < 4:
protocol A : class { ... }
は class-only protocol" : クラス型のみ(構造体や列挙体は不可)がこのプロトコルを採用することができます。
弱参照は 参照型 . クラス は参照型、構造体や列挙型は値型です。 (クロージャも参照型ですが、クロージャはプロトコルを採用できないので、この文脈では関係ありません) プロトコルを採用できないので、この文脈では関係ありません)。
したがって、プロトコルに準拠したオブジェクトを弱いプロパティに格納する必要がある場合、そのプロトコルはクラスのみのプロトコルでなければなりません。
クラス・オンリー・プロトコルを必要とする別の例を示します。
protocol A {
var name : String { get set }
}
func foo(a : A) {
a.name = "bar" // error: cannot assign to property: 'a' is a 'let' constant
}
構造体や列挙型のインスタンスのため、コンパイルされません。
a.name = "bar"
の変異であるためです。
a
. もし
と定義すると、プロトコルは
protocol A : class {
var name : String { get set }
}
とすると、コンパイラは
a
がそのクラス型のインスタンスであることを知る。
a
はオブジェクトストレージへの参照です。
そして
a.name = "bar"
は参照されたオブジェクトを変更しますが
a
.
一般に、プロトコルを採用する型が値型ではなく参照型である必要がある場合、クラスのみのプロトコルを定義することになります。 プロトコルを採用する型が参照型であり、値型でないことが必要な場合、一般にクラスのみのプロトコルを定義します。
関連
-
Swift の Optional 値 && Optional のアンラップ時に予期せず nil が検出された場合の説明
-
[解決済み] 純粋な」Swift で弱いプロトコル参照を作るには (@objc なしで) どうしたらいいですか?
-
[解決済み] Swiftのクラスにおける静的関数/変数とクラス関数/変数?
-
[解決済み】Swiftの`let`と`var`の違いは何ですか?
-
[解決済み] Swiftダブルからストリング
-
[解決済み] Swiftで警告を消すには?
-
[解決済み] Swiftでenumをプロトコルに準拠させるには?
-
[解決済み] XcodeでFirebase Analyticsをオンにする
-
[解決済み] Swift 3 GCD API変更後のdispatch_once
-
[解決済み] なぜ "weak "というキーワードは、クラスおよびクラスバインドプロトコル型にのみ適用できるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Swiftがエラーを報告。アボートトラップ:6
-
[解決済み] Protocol ... can only be used as generic constraint because it has Self or associated type requirements "とは、どういう意味ですか?
-
[解決済み] Swift 3でカスタム通知を作成するには?
-
[解決済み] Swift の @escaping と Completion ハンドラ
-
[解決済み] Swiftでenumの関連値を無視して比較する方法は?
-
[解決済み] Swift で型に表示されるテキスト表現を変更するにはどうしたらいいですか?
-
[解決済み] あるプロトコルを特定のクラスにのみ適用することを要求する方法
-
[解決済み] Codableクラスはプロトコルに準拠していない Decodable
-
[解決済み] Swiftの拡張機能例
-
[解決済み] Swift 3.0 でコンパイルしたモジュールを Swift 3.0.1 でインポートできない。