2016-09-17 8 views
5

Swiftで汎用クラス定数をどのように定義しますか?あなたはこのようにそれらを定義することができる "ノーマル" クラスの場合すばやくジェネリッククラスの静的定数を定義する方法は?

問題

class C { 
    static let k = 1 
} 

let a = C.k // 1 

をしかし、あなたはジェネリッククラスで同じことを行う場合:

class C<T> { 
    static let k = 1 
} 

あなたはコンパイル時に次のエラーが発生します。

ジェネリックタイプではまだサポートされていない静的ストアドプロパティ

これを解決するにはどうすればよいですか?

私の現在のソリューションは、私はこれを解決するためにstructを使用しています:

struct CConstant { 
    static let K = 1 
} 

これは、一般的なクラスのスコープで定義されたが、それは私のために動作していません。 もっと良い解決策はありますか?

-

PS:これは

答えて

2

あなたはfileprivateまたはprivateアクセスレベルでグローバル定数を定義することができます)=ので、あなたはそれが必要だと思うなら、私はこの質問を向上させる助けてください、ここで私の最初の質問です同じ.swiftファイルで、汎用クラスが定義されています。したがって、このファイルの外側には表示されず、グローバル(モジュール)名前空間は汚染されません。

現在のファイルの外側からこの定数にアクセスする必要がある場合は、internal(デフォルトのアクセスレベル)またはpublicと名前として、ClassConstantようなので、それはそれはClassに関連することは明らかであることを宣言します。

access levels in Swift 3についてさらに読む。些細な値に型指定された定数の

+0

ありがとうございます。あなたの提案は私の現在の解決策と同じ方向にあるようです。私は、コンテキストに応じてアクセサーを指定するだけです。 静的ストアドプロパティがジェネリック型でまだサポートされていない理由を正確に知っていますか? – ghashi

+0

型パラメータを指定しないでジェネリック型を使用することはできないので、まだサポートされていないと思います。静的なプロパティにアクセスしたいだけなら、 'SomeClass 。someConstant'は醜いものに見えます。型パラメータを指定せずに動作させるには、コンパイラでこれを実装する必要があります。これはSwiftチームの最優先課題ではないと思います。 – mixel

1

、あなたは単に読み取り専用の静的計算されたプロパティを実装することができます:それはC<T>上の静的なメンバーだとして

class C<T> { 
    // will be evaluated every time the static property is accessed, 
    // therefore not suited for non-trivial constants. 
    static var k : Int { return 1 } 
} 

let a = C<()>.k // Access k on C<Void> 

これは、「グローバルな名前空間」を汚染しないという利点を持っています。残念ながら、定数を使用するにはジェネリックパラメータを指定する必要があります。ジェネリックパラメータのないタイプを参照することはできません(静的スコープのもので定義する必要があるかもしれません)。非自明な定数の

、あなたはプライベート・グローバル定数を定義し、外の世界にそれを露出させるためにあなたのジェネリッククラスで読み取り専用の静的計算されたプロパティを使用できます。

private let _k = SomeClass() 

class C<T> { 
    static var k : SomeClass { return _k } 
} 

ここでも、これにより、C<T>上の静的メンバーとしてアクセスすることができますが、 'グローバル名前空間'を汚染することはありません(Swiftファイルの外にはありません)。

関連する問題