web-dev-qa-db-ja.com

swiftで 'protected'変数を宣言する方法

別のクラスを継承するクラスを作成します。このクラスは、異なるファイルにあります。

例えば:

Class1.Swift

class Class1
{
    protected var 
    //Do Stuff
}

Class2.Swift

class Class2:Class1
{
    //Do stuff
}

迅速に「保護された」変数/関数にアクセスするにはどうすればよいですか?

プライベート変数/関数を宣言するとき、そのクラスでのみ使用できます。 「fileprivate」を使用する場合、他のクラスは保存ファイルにClass1として存在します。私がやりたいことは、クラスを個別のファイルに保持し、Xcode内からグループを使用して、どのクラスがどのカテゴリに属しているかを知ることです。

26
iProgram

そのためにinternalを使用する必要がありますSwiftは(他の多くのプログラミング言語とは異なり)protectedキーワードを提供しません。)internalのみがfileprivatepublic間のアクセス修飾子:

内部アクセスにより、定義モジュールのソースファイル内でエンティティを使用できますが、そのモジュール外のソースファイルでは使用できません。通常、アプリまたはフレームワークの内部構造を定義するときに内部アクセスを使用します。

言語デザイナーがprotectedキーワード(または同等のもの)を提供しないことを選んだ理由についてもう少し説明する ブログ投稿 があります。

その理由のいくつかは

サブクラスは常に新しいパブリックメソッドまたはプロパティを介して「保護された」APIを公開できるため、実際の保護は提供されません。

また、拡張がprotectedプロパティにアクセスする必要があるかどうかが明確ではないため、拡張に関してはprotectedが問題を引き起こすという事実。

38
Keiwan

Swiftはprotectedアクセスを提供しませんが、それでも同様のアクセスを実現できますfileprivateアクセス制御を使用して)。
親が宣言したのと同じファイル内のすべての子を宣言する必要があるということだけを覚えておく必要がある。

Animal.Swift

import Foundation

class Animal {
    fileprivate var protectedVar: Int = 0
}

class Dog: Animal {
    func doSomething() {
        protectedVar = 1
    }
}

OtherFile.Swift

let dog = Dog()
dog.doSomething()
5
D4ttatraya