SwiftUI 中的过滤逻辑 - Apple 教程

Filter Logic in SwiftUI - Apple Tutorial

我正在学习 Landmarks SwiftUI 教程 https://developer.apple.com/tutorials/swiftui/handling-user-input。我对

中逻辑运算符的使用感到困惑
landmarks.filter { landmark in
            (!showFavoritesOnly || landmark.isFavorite)
        }

我试图了解此逻辑在返回过滤后的地标时是如何工作的。我很确定!运算符反转 showFavoritesOnly 操作数和 || landmark.isFavorite 上的运算符如果闭包中的任何一方为真,则该语句为真,但由于某种原因,就返回的内容而言,这应该发生的事情目前让我无法理解.如果有人能澄清,我将不胜感激。

这是上下文文件:

 import SwiftUI
    
    struct LandmarkList: View {
        @State private var showFavoritesOnly = false
        
        var filteredLandmarks: [Landmark] {
            landmarks.filter { landmark in
                (!showFavoritesOnly || landmark.isFavorite)
            }
        }
        
        var body: some View {
            NavigationView {
                List(filteredLandmarks)
                    { landmark in
                    NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                        LandmarkRow(landmark: landmark)
                    }
                }
                .navigationTitle("Landmarks")
            }
        }
    }
    
    struct LandmarkList_Previews: PreviewProvider {
        static var previews: some View {
                LandmarkList()
        }
    }

I'm pretty sure the ! operator inverts the showFavoritesOnly operand and the || operator on landmark.isFavorite makes the statement true if either side is true

你完全正确。

but for some reason this what is supposed to happen as far as what is returned escapes me at the moment.

filter(_:) 方法可让您过滤 数组(删除不满足条件的元素)。

它接受一个闭包,isIncluded。这个闭包为数组中的每个元素调用一次,当前元素传递到参数中:

               /// ↓ the current element in the array
landmarks.filter { landmark in }

这个闭包必须 return 一个 Bool,表示是否应该保留元素。

  • 所以如果它 returns true,这意味着保留元素
  • 如果false,则删除元素

在您的实施中,您将保留 showFavoritesOnly 为假或 isFavorite 为真的元素。

landmarks.filter { landmark in
    (!showFavoritesOnly || landmark.isFavorite) /// return the Bool
}

也许您对为什么没有 return 声明感到困惑...

landmarks.filter { landmark in
    return (!showFavoritesOnly || landmark.isFavorite)
}

原因是因为当你只有一个表达式时,return关键字是可选的。如果你做了类似的事情:

landmarks.filter { landmark in
    let elementShouldBeKept = (!showFavoritesOnly || landmark.isFavorite)
    return elementShouldBeKept
}

...那么您需要 return.

!showFavoritesOnly 等同于 if (showFavoritesOnly == false) return true

因此,在评估筛选列表时: 如果 !showFavoritesOnly,它不需要评估语句的其余部分,因为返回 'true',并且元素被放置在要显示的列表中(即在这种情况下所有元素的未过滤列表,因为每个元素的计算结果都是 showFavoritesOnly == false).

但是,一旦 showFavoritesOnly 变为真,计算机就会计算语句的下半部分。

我做了一个流程图来帮助我形象化这个概念: