iOS SwiftUI 中 ForEach 内的 if 语句

Posted

技术标签:

【中文标题】iOS SwiftUI 中 ForEach 内的 if 语句【英文标题】:if statement inside of ForEach in iOS SwiftUI 【发布时间】:2020-08-05 17:52:13 【问题描述】:

我在 ios SwiftUI(Xcode 版本 11.6)的 ForEach 中有一个“if”,它可以正常工作。

struct ContentView: View 
    var body: some View 
        List 
            ForEach(0 ..< 10) (i: Int) in
                if i % 2 == 0 
                    Text(String(i))
                
            
        
    

现在我想做同样的事情,但使用字符串数组而不是半开范围的 Ints。

struct ContentView: View 
    let states: [String] = [
        "Alabama",
        "Alaska",
        "Arizona",
        "Arkansas",
        "California"
    ];
    
    var body: some View 
        List 
            ForEach(states, id: \.self) (state: String) in
                if state.hasPrefix("Al") 
                    Text(state)
                
            
        
    

我从这个 ForEach 得到的错误信息是

Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols

出了什么问题?我很困惑,因为 Apple 的 SwiftUI 教程在第 3 节第 1 步的 ForEach 中有一个“if” https://developer.apple.com/tutorials/swiftui/handling-user-input 提前谢谢你。

【问题讨论】:

【参考方案1】:

您可以尝试以下方法:

struct ContentView: View 
    ...
    
    var body: some View 
        List 
            ForEach(states, id: \.self)  state in
                self.stateView(state: state)
            
        
    
    
    @ViewBuilder
    func stateView(state: String) -> some View 
        if state.hasPrefix("Al") 
            Text(state)
        
    

这样您的代码也可能更具可读性。

【讨论】:

【参考方案2】:

一种可能的方法是使用Group:

struct ContentView: View 
    let states: [String] = [
        "Alabama",
        "Alaska",
        "Arizona",
        "Arkansas",
        "California"
    ];
    
    var body: some View 
        List 
            ForEach(states, id: \.self) (state: String) in
                Group 
                    if state.hasPrefix("Al") 
                        Text(state)
                    
                
            
        
    

有些视图比其他视图更灵活一些。例如,在 HStack 或 VStack 中,您甚至可以放置多个(子)View,而在 ForEach 中则不能。 Group 有很大的灵活性,但不影响布局,所以通常你可以用它来包装复杂的视图。

【讨论】:

以上是关于iOS SwiftUI 中 ForEach 内的 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中修改 ForEach 内的视图

SwiftUI:VStack 中 ForEach 中的 HStack 使多行文本重叠

List 内的 SwiftUI zIndex

SwiftUI - 在 ForEach 中获取 TextField 数组

SwiftUI:数组内的修饰符

如何在 SwiftUI 中使用 Foreach 视图?