You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SwiftUI中启动应用时显示列表内的随机问题

实现启动时展示随机问题的SwiftUI方案

要实现启动时仅展示列表中的随机一个问题,核心是从defis数组中随机选取单个元素而非遍历全部,以下提供两种可行方案:

方案一:在视图内处理随机逻辑

直接在视图中通过状态变量存储随机问题,在视图首次出现时生成随机索引获取元素:

import SwiftUI

struct ViewJouer2: View {
    @EnvironmentObject var data: DefisList
    @State private var randomDefi: Defi?
    
    var body: some View {
        List {
            // 仅展示随机选中的问题
            if let defi = randomDefi {
                DefiRow(Defi: defi)
            }
        }
        .onAppear {
            // 避免数组为空时触发崩溃
            guard !data.defis.isEmpty else { return }
            let randomIndex = Int.random(in: 0..<data.defis.count)
            randomDefi = data.defis[randomIndex]
        }
    }
}

struct ViewJouer2_Previews: PreviewProvider {
    static var previews: some View {
        ViewJouer2()
            .environmentObject(DefisList())
    }
}

方案二:在数据模型中封装随机逻辑

将随机逻辑统一放在DefisList中,更符合MVVM架构,方便后续扩展(比如添加重新获取随机问题的功能):

修改数据代码:

import SwiftUI

class DefisList: ObservableObject {
    @Published var defis = [
        Defi(question: "How old are you?"),
        Defi(question: "How are you"),
        Defi(question: "What is your name?"),
    ]
    @Published var randomDefi: Defi?
    
    init() {
        // 初始化时自动生成随机问题
        updateRandomDefi()
    }
    
    // 封装随机方法,可复用
    func updateRandomDefi() {
        guard !defis.isEmpty else {
            randomDefi = nil
            return
        }
        // 直接使用数组的randomElement()方法简化代码
        randomDefi = defis.randomElement()
    }
}

struct Defi: Identifiable {
    var question: String
    var id = UUID()
}

修改视图代码:

import SwiftUI

struct ViewJouer2: View {
    @EnvironmentObject var data: DefisList
    
    var body: some View {
        List {
            if let defi = data.randomDefi {
                DefiRow(Defi: defi)
            }
        }
    }
}

struct ViewJouer2_Previews: PreviewProvider {
    static var previews: some View {
        ViewJouer2()
            .environmentObject(DefisList())
    }
}

注意事项

  • 必须判断defis数组是否为空,防止数组为空时出现索引越界或可选值解包崩溃;
  • 方案一中的onAppear会在视图每次出现时重新生成随机问题,适合需要每次进入页面都刷新的场景;
  • 方案二中的updateRandomDefi方法可以单独调用,如果需要添加“换一个问题”的按钮,直接触发该方法即可。

内容的提问来源于stack exchange,提问作者josé

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:30:57