实现效果:通过点击存钱罐动画,每次点击随机显示谚语。
本地化随机
因为输出的语句需要实现本地化功能,因此在Localizable文件中,设置每个谚语
在这里,将每一个本地化谚语的key设置为proverb0、proverb1…
在视图代码中,设置一个计算属性,用于随机显示proverb+随机的数字。
var proverbs: String {
let range = 0..<22
return "proverb"+"\(Int.random(in: range))"
}
在这个代码中,因为我的谚语是proverb前缀,从0开始一直到21,因此range的范围就是0..<22。
通过proverbs计算属性,每次使用时,都会输出一个proverb+0到21的随机数。
在视图中,通过LocalizedStringKey实现字符串本地化的转换。
Text(LocalizedStringKey(proverbs))
这样,就可以通过计算属性输出随机的内容。
JSON随机
上面是通过设置Localizable文件的Key,随机显示谚语。还有一种比较常规的方法,就是将谚语存储在一个文件中,然后从文件中随机读取一个谚语显示。这种方法既不依赖于本地化系统,又灵活且易于维护。
实现细节
1、创建一个 JSON 文件
在项目中添加一个名为 proverbs.json 的文件,并在其中存储谚语列表。例如:
[
"A journey of a thousand miles begins with a single step.",
"Don't put all your eggs in one basket.",
"Actions speak louder than words.",
"Every cloud has a silver lining.",
"Fortune favors the brave.",
"The pen is mightier than the sword.",
"When in Rome, do as the Romans do."
]
将此文件放入项目的 Bundle 中。
在 Swift 中,使用 Bundle 来读取文件内容,然后将其解析为数组:
2、创建一个读取文件的函数
在 Swift 中,使用 Bundle 来读取文件内容,然后将其解析为数组:
import Foundation
func loadProverbs() -> [String] {
guard let url = Bundle.main.url(forResource: "proverbs", withExtension: "json") else {
print("Proverbs file not found.")
return []
}
do {
let data = try Data(contentsOf: url)
let proverbs = try JSONDecoder().decode([String].self, from: data)
return proverbs
} catch {
print("Failed to load or decode proverbs: \(error)")
return []
}
}
3、在视图中使用随机谚语
在视图中引入 @State 来保存当前的谚语。
在 onAppear 或用户交互时,随机选择一个谚语。
import SwiftUI
struct randomProverbs: View {
@State private var proverbs: [String] = []
@State private var currentProverb: String = "Loading..."
var body: some View {
VStack {
Text(currentProverb)
.font(.headline)
.padding()
Button(action: {
if !proverbs.isEmpty {
currentProverb = proverbs.randomElement() ?? "No proverb available."
}
}, label: {
Text("Get Random Proverb")
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
})
}
.onAppear {
proverbs = loadProverbs()
currentProverb = proverbs.randomElement() ?? "No proverb available."
}
}
}
#Preview {
randomProverbs()
}
最终的实现效果为,每次点击按钮或刷新视图时,都会随机输出谚语。
主要的代码:
1、首先是通过函数将JSON中的各语句解析为一个字符串数组。
2、在视图中,将解析的字符串数组存储在一个@State的数组中。
3、调用数组的randomElement方法,从数组中随机抽取一个值赋值给显示的文本。
4、最终实现随机输出语句的效果。