我有一个JSON
文件,JSON
的内容如下。我正在iOS中读取JSON文件,并根据我显示的数据显示。
"start": {
"title": "Welcome",
"toPoint": "Hello World"
}
我想要做的是我想提供
的动态值“title”:“欢迎”
来自struct
或enum
或任何let
常量。
所以,当我从JSON
读取数据时,我得到值欢迎
let title = dict["start"]["title"]
现在会有一个像下面这样的常量,它应该显示该文本。
let Welcome = "This is the actual string to display"
是否有可能做这样的事情?
答案 0 :(得分:1)
你不能;变量名称是代码中的常量,您不能使用字符串值设置它们:)
答案 1 :(得分:1)
是的,可以这样做。 你所需要的只是一本词典。
var titles: [String: String] = ["Welcome": "This is the actual string to display"]
let title = dict["start"]["title"]
let Welcome = titles[title]
如果您不想使用词典,可以使用KVC
获取iVar属性。
只需确保您的班级继承自NSObject
。
let Welcome = "This is the actual string to display"
let title = dict["start"]["title"]
let welcomeString = self.value(forKey: title)
print("Welcome:\(welcomeString)")
或者,您可以将所有字符串移动到单独的类中(而不是Struct,因为KVC不适用于结构):
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let title = dict["start"]["title"]
let welcome = Strings.value(forKey: title)
print("Welcome:\(welcome)")
}
//MARK: - Strings for our ViewController
fileprivate class Strings:NSObject {
static let Welcome = "This is the actual string to display"
}
}
答案 2 :(得分:1)
我试着从10分钟开始思考为什么你真的需要这个?
我想你需要这个本地化的东西?
然后有很多解决方案。
Apple已经包含了许多用于国际化和本地化的玩具:
见这里:https://developer.apple.com/internationalization/
或者还有很多其他的库让i18n更容易上线
例如:https://github.com/Kekiiwaa/Localize
如果您不喜欢上述解决方案,唯一的方法是通过字典:
var dict = [
"Welcome" : "Hello Wold",
"Thanks" : "Tank you",
"Hello" : "Hello"
]
var key = "Welcome"
print(dict[key]!) // -> "Hello Wold"
你可以嵌套词典:
var dict = [
"en": [
"Welcome" : "Hello Wold",
"Thanks" : "Tank you",
"Hello" : "Hello"
],
"de": [
"Welcome" : "Guten Tag",
"Thanks" : "Danke",
"Hello" : "Hallo"
]
]
var language = "de"
var key = "Welcome"
print(dict[language]![key]!) --> "Guten Tag"
PS:但你应该更好地使用默认的i18n解决方案
用于逆向工程是Mirror
用于检查类和结构以及枚举的类
如果您对此感兴趣,请参阅:https://developer.apple.com/reference/swift/mirror