web-dev-qa-db-ja.com

「非オープンクラスから継承できません」swift

Xcode 8ベータ6の時点で、コンパイルモジュール「定義モジュール外の非オープンクラス(クラス)から継承できません」が表示されます。

私が継承していたクラスは、別のSwiftフレームワークの一部でしたが、プロジェクトはXcode 8ベータ5用にコンパイルされました。プロジェクトを再度コンパイルするには、何を変更する必要がありますか?

26
LOP_Luke

自分で答えを見つけました。

Swift 3では、クラスをopenの代わりにpublicとしてマークできるようになりました。これにより、モジュール外のファイルがそのクラスをサブクラス化できます。

モジュールクラスのpublicopenに置き換えるだけです。

参照 ここ

48
LOP_Luke

継承元のクラスは、openではなくpublicとして定義する必要があります。

Swift 3:のアクセス制御の変更に関するもう少しのコンテキスト:

Swift 2には3つのアクセスレベルしかありませんでした。

  • private:エンティティは、定義されているソースファイル内からのみ使用できます。
  • internal:定義を含むモジュール全体でエンティティを使用できます。
  • public:エンティティはAPIとして使用するためのもので、モジュールをインポートする任意のファイルからアクセスできます。

Swift 3はさらに2つのアクセスレベル(openfileprivate)を追加し、privateの意味を変更しています:

  • private:現在の宣言内でのみ表示されるシンボル。
  • fileprivate:現在のファイル内で見えるシンボル。
  • internal:現在のモジュール内で見えるシンボル。
  • public:現在のモジュールの外部から見えるシンボル。
  • open:現在のモジュールの外部でサブクラス化またはオーバーライドされるクラスまたは関数用。
21
Yann Bodson