我可以更换 || with && - Apple 的 SwiftUI 教程

Can I replace || with && - Apple's SwiftUI tutorial

我正在学习 Apple 的 SwiftUI 教程 here 我正在查看 第 2 节 "Filter the List View" 第 3 步第 9 行 我已经包含在下面了。

我想知道是否||可以换成&&效果一样吗? (按收藏夹过滤行列表,没有任何意外的副作用)。

在 canvas 中它具有相同的效果,尽管我特别质疑为什么 ||被使用了,因为 && 对我来说更有意义。

import SwiftUI

struct LandmarkList: View {
    @State var showFavoritesOnly = false

    var body: some View {
        NavigationView {
            List(landmarkData) { landmark in
                if !self.showFavoritesOnly || landmark.isFavorite {
                    NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                        LandmarkRow(landmark: landmark)
                    }
                }
            }
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}

struct LandmarkList_Previews: PreviewProvider {
    static var previews: some View {
        LandmarkList()
    }
}

这些运算符有不同的含义,||表示或,而&&表示与。因此,如果您使用 AND 而不是 OR,它不会在您打开过滤器时显示任何项目,而在您关闭过滤器时仅显示收藏夹。

如果您真的更喜欢使用 AND 运算符 && 而不是 OR ||,则您需要检查地标是否不受欢迎以及过滤器是否开启。

if !(self.userData.showFavoritesOnly && !landmark.isFavorite) {
    // code
}

根据德摩根定律

!A && !B == !(A || B)
!A || !B == !(A && B)

所以 Leo Tabus 的方法是正确的,但我认为转换表达式会增加代码的复杂性。并且否定整个表达式在表达式中有两个否定使得更难理解结果是什么。我个人更喜欢

这样的表达
if foo == false {}

因为与

相比,它读起来更像一个句子
if !foo {}

但是更短。

最后我发现

if self.showFavoritesOnly == false || landmark.isFavorite {}

更直观、更容易理解,尤其是在午夜和 10 小时工作日之后尝试查找错误时。