SwiftUI 中的过滤器逻辑 - Apple 教程

Jam*_*esH 2 logical-operators swiftui

我正在研究 Landmarks SwiftUI 教程https://developer.apple.com/tutorials/swiftui/handling-user-input。我对逻辑运算符的使用感到困惑

landmarks.filter { landmark in
            (!showFavoritesOnly || landmark.isFavorite)
        }
Run Code Online (Sandbox Code Playgroud)

我试图理解这个逻辑如何返回过滤的地标。我很确定!运算符反转showFavoritesOnly操作数和 || 如果闭包中任一方为真,则地标.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()
        }
    }
Run Code Online (Sandbox Code Playgroud)

ahe*_*eze 5

\n

我很确定!运算符反转 showFavoritesOnly操作数和|| 当任一方为 true 时,landmark.isFavorite 上的运算符使语句为 true

\n
\n

你是完全正确的。

\n
\n

但由于某种原因,就返回的内容而言,我目前无法理解应该发生的情况。

\n
\n

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

\n

它需要一个闭包,isIncluded. 对于数组中的每个元素调用此闭包一次,并将当前元素传递到参数中:

\n
               /// \xe2\x86\x93 the current element in the array\nlandmarks.filter { landmark in }\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
    \n
  • 所以如果它返回true,则意味着保留该元素
  • \n
  • 如果false,则删除该元素
  • \n
\n

在您的实现中,您将保留为showFavoritesOnlyfalse 的元素或isFavoritetrue 的元素。

\n
landmarks.filter { landmark in\n    (!showFavoritesOnly || landmark.isFavorite) /// return the Bool\n}\n
Run Code Online (Sandbox Code Playgroud)\n

也许您对为什么没有 return 语句感到困惑......

\n
landmarks.filter { landmark in\n    return (!showFavoritesOnly || landmark.isFavorite)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
landmarks.filter { landmark in\n    let elementShouldBeKept = (!showFavoritesOnly || landmark.isFavorite)\n    return elementShouldBeKept\n}\n
Run Code Online (Sandbox Code Playgroud)\n

...那么你需要return.

\n