2017-10-18 29 views
0

我试图让一个字符串属性显示不同的语言,如果条件。最后一条语句显示错误!我如何获得会员价值?斯威夫特,我怎么能得到一个属性

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

正如你已经宣布stringObj同类型Any?,雨燕编译器不知道它的实际类型是什么或者有什么样的特性。

如果两种类型CNEN有一个共同的属性,你可以使用一个协议来指定这个?

protocol Language { 
    var hello: String { get } 
} 

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

var stringObj: Language? 

... 
+2

这应该是正确的答案... –

+0

非常感谢,这似乎解决了我的问题。我希望用户能够即时更改UI语言,因此不考虑使用NSLocalizedString。 – HIEPING