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