为啥我不能在 SwiftUI 中使用 append 创建数组

Posted

技术标签:

【中文标题】为啥我不能在 SwiftUI 中使用 append 创建数组【英文标题】:Why can I not use append to create an array in SwiftUI为什么我不能在 SwiftUI 中使用 append 创建数组 【发布时间】:2020-11-13 12:45:19 【问题描述】:

我有以下简单的例子:

struct Test 
    var id:Int
    var text:String

struct ContentView: View 

    var array = [Test]()

    var body: some View 
        VStack
            
            ForEach(0...3, id:\.self) key in
                let test = Test(id: key, text: "Testing")
                array.append(test)
          
            

我收到错误消息: 类型 '()' 不能符合 'View';只有结构/枚举/类类型可以符合协议 如果我删除 array.append 行,那么错误消息就会消失。所以,在 Swift 中这会很好用,但在 SwiftUI 中这似乎是不同的。有人可以解释一下为什么以及如何通过循环添加元素来实现数组的创建。

【问题讨论】:

ForEach 是一个视图容器,而不是控制流操作符。 好的,那么,在 SwiftUI 中还有另一种创建数组的方法吗? 实际上,使用 func 可以解决问题。使用“for key in 1...5 ” 我没有意识到 ForEach 不能用作 Swift 中的 foreach。谢谢 【参考方案1】:

这是一个简单的演示

struct Test: Identifiable 
    var id:Int
    var text:String


struct ContentView: View 
    
    var array: [Test] = (0...3).map  Test(id: $0, text: "Testing") 
    
    var body: some View 
        VStack
            ForEach(array)  test in
                Text("\(test.id): \(test.text)")
            
        
    

【讨论】:

您也可以在初始化程序中使用 for 循环 (for i in 0...3 in ) 来创建数组,而不是 (0...3).map

以上是关于为啥我不能在 SwiftUI 中使用 append 创建数组的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我在 UIHostingController 中使用 SwiftUI-transition 时,它不能按预期工作?

为啥 swipeActions 修饰符不能直接与 List 容器一起使用? #SwiftUI

为啥 SwiftUI 不能正确显示两个视图?

为啥 SwiftUI ObservedObject 不能在列表行中工作?

为啥 EmptyView() 不能在带有 SwiftUI 的 WatchOS 上工作?

SwiftUI 为啥不能在视图之间传递发布者?