2017-10-18 10 views
0

if条件によって異なる言語を表示する文字列プロパティを持つことを試みました。最後の文はエラーを表示します!メンバーの値を取得するにはどうすればよいですか?スウィフト、どうすればプロパティを取得できますか?

struct EN { 
    let hello = "Hello!" 
} 

struct CN { 
    let hello = "Hi!" 
} 

var stringObj:Any? 

var language = "CN" 

if language == "EN" { 
    stringObj = EN() 
} 

if language == "CN" { 
    stringObj = CN() 
} 

print(stringObj!) // "CN(hello: "Hi!")\n" on playground 

print(stringObj!.hello) // error! has no member "hello" 
+0

あなたstringObjは任意のタイプである...どれ? helloプロパティを持っていません...あなたのObjectをキャストする必要があります。または、あなたのhelloをサポートするスーパークラスとしてプロトコルを使用してください。 –

+0

@LeoDabus彼は本当にここで共通のプロトコルを定義する必要があります。 Palleの答えを参照してください... –

+0

私は彼がNSLocalizedStringを使うべきだと思います。ホイールを再構築する必要はありません。 –

答えて

3

あなたがタイプAny?stringObjを宣言してきたように、スウィフトコンパイラは、その実際の型が何であるか、それが持っているものの性質は考えていません。

両方のタイプCNENが共通の性質を持っている場合は、あなたがこれを指定するプロトコルを使用することができます。

protocol Language { 
    var hello: String { get } 
} 

struct EN: Language {...} 
struct CN: Language {...} 

var stringObj: Language? 

... 
+2

これは正解でなければなりません... –

+0

ありがとう、これは私の問題を解決するようです。ユーザーがUI言語をオンザフライで変更できるようにしたいので、NSLocalizedStringを使用することを検討しませんでした。 – HIEPING

関連する問題