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

SwiftUI中如何访问函数内部变量并在结构体body中使用

解决方案

核心问题为当前testFunc是无返回值函数,内部定义的tester属于仅在函数作用域内生效的局部变量,外部无法直接访问。可根据你的实际使用场景选择对应实现方案:

方案1:无需后续修改数组,直接让函数返回结果

如果你仅需要拿到洗牌后的数组做展示,不需要后续修改数组同步UI,直接给函数添加返回值即可,不需要用到绑定:

struct ContentView: View {
    var body: some View {
        let shuffledArray = testFunc()
        // 示例:用List展示洗牌后的数组元素
        List(shuffledArray, id: \.self) { element in
            Text(element)
        }
    } 

    // 给函数添加[String]返回类型,返回处理后的数组
    func testFunc() -> [String] {
        return ["a", "b", "c"].shuffled()
    }
}

方案2:需要后续修改数组并同步刷新UI

如果你后续需要对数组做重新洗牌、增删元素等操作,且要求修改后UI自动刷新,使用@State属性包装器存储数组即可,无需绑定:

struct ContentView: View {
    // @State修饰的属性会被SwiftUI托管,修改时自动触发UI刷新
    @State private var shuffledArray: [String] = []
    
    var body: some View {
        VStack {
            List(shuffledArray, id: \.self) { element in
                Text(element)
            }
            // 示例:点击按钮重新洗牌
            Button("重新洗牌") {
                testFunc()
            }
        }
        .onAppear {
            // 页面首次加载时执行一次洗牌
            testFunc()
        }
    } 

    func testFunc() {
        // 直接修改@State修饰的属性即可触发UI更新
        shuffledArray = ["a", "b", "c"].shuffled()
    }
}

关于绑定的说明

@Binding的适用场景是父子视图之间双向同步数据,比如你需要把数组传给子视图,且子视图修改数组时需要同步更新父视图的数据源,这种场景才需要用到绑定。如果仅在当前ContentView内部使用数组,绑定完全不是最优解,反而会增加冗余逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:15:03