【问题标题】:Can I replace || with && - Apple's SwiftUI tutorial可以换吗|| with && - Apple 的 SwiftUI 教程
【发布时间】:2020-02-21 22:54:20
【问题描述】:

我正在关注 Apple 的 SwiftUI 教程 here,我正在查看第 3 步第 9 行中的 第 2 节 “过滤列表视图”包括在下面。

我想知道是否 ||可以用 && 代替并具有相同的效果吗? (按收藏夹过滤行列表,没有任何意外的副作用)。

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

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()
    }
}

【问题讨论】:

    标签: swift operators swiftui


    【解决方案1】:

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

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

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

    【讨论】:

    • 啊啊啊啊,现在说得通了。不知道为什么这让我如此困惑。谢谢!
    【解决方案2】:

    根据德摩根定律

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

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

    if foo == false {}
    

    因为它读起来更像是一个句子

    if !foo {}
    

    然而,它更短。

    最后我找到了

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多