SwiftUI中的过滤逻辑-苹果教程

SwiftUI中的过滤逻辑-苹果教程,swiftui,logical-operators,Swiftui,Logical Operators,我正在学习Landmarks SwiftUI教程。我对逻辑运算符在中的使用感到困惑 landmarks.filter { landmark in (!showFavoritesOnly || landmark.isFavorite) } 我试图理解这个逻辑在返回filteredLandmarks时是如何工作的。我敢肯定这是真的!运算符仅反转showFavorite操作数和landmark上的| |运算符。isFavorite使语句在闭包中的任何一方为真时

我正在学习Landmarks SwiftUI教程。我对逻辑运算符在中的使用感到困惑

landmarks.filter { landmark in
            (!showFavoritesOnly || landmark.isFavorite)
        }
我试图理解这个逻辑在返回filteredLandmarks时是如何工作的。我敢肯定这是真的!运算符仅反转showFavorite操作数和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()
        }
    }
我很肯定这是一个很强的例子!运算符仅反转showFavorite操作数,landmark.isFavorite上的| |运算符使语句在任意一侧为true时变为true

你完全正确

但由于某种原因,我一时想不起该发生的事情,只要返回的是什么

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

它接受一个闭包,
包含在内
。对数组中的每个元素调用此闭包一次,并将当前元素传递到参数中:

               /// ↓ the current element in the array
landmarks.filter { landmark in }
此闭包必须返回一个
Bool
,它表示是否应该保留元素

  • 因此,如果它返回
    true
    ,则表示保留该元素
  • 如果
    false
    ,则移除该元素
在您的实现中,您只保留其
showFavorite
为false或
isFavorite
为true的元素

landmarks.filter { landmark in
    (!showFavoritesOnly || landmark.isFavorite) /// return the Bool
}
也许你不明白为什么没有返回声明

landmarks.filter { landmark in
    return (!showFavoritesOnly || landmark.isFavorite)
}
原因是当您只有一个表达式时,
return
关键字是可选的。如果您做了如下操作:

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

。。。然后你需要
返回

@JamesH
操作员仅影响
显示偏好
。它检查它是真是假,然后计算出相反的结果
ShowFavoriteOnly
从未被修改过。@shaze我想我明白了。这是个好答案。因此,如果showFavoritesOnly被初始化为false!运算符将其反转为true,以便在闭包中进行评估,因此无需在| |之后检查landmark.isFavorite,因为闭包已确定闭包为true。因此,[Landmark]数组中的每个元素都将被返回。从某种程度上说,这就是我从中得到的。@JamesH正是!如果
showFavoritesOnly
是真的,那么
!ShowFavoriteOnly
将为false,因此由
landmark.isFavorite
决定是否保留该元素。