SwiftUI随机显示语句
SwiftUI随机显示语句

SwiftUI随机显示语句

实现效果:通过点击存钱罐动画,每次点击随机显示谚语。

本地化随机

因为输出的语句需要实现本地化功能,因此在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、最终实现随机输出语句的效果。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注