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
变为真,计算机就会计算语句的下半部分。
我做了一个流程图来帮助我形象化这个概念:
我正在学习 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
变为真,计算机就会计算语句的下半部分。
我做了一个流程图来帮助我形象化这个概念: