Могу ли я заменить || с && - учебник Apple по SwiftUI - PullRequest
0 голосов
/ 22 февраля 2020

Я следую учебному пособию Apple по SwiftUI здесь и смотрю раздел 2 "Фильтр списка" в шаге 3, строка 9 , которую я Я включил ниже.

Мне было интересно, если || может быть заменен на && и иметь такой же эффект? (фильтрация списка строк по избранным без каких-либо непреднамеренных побочных эффектов).

На холсте это имеет тот же эффект, хотя конкретно я спрашиваю, почему || был использован, так как && имеет больше смысла для меня.

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

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Эти операторы имеют разные значения, || означает ИЛИ, а && означает И. Поэтому, если вы используете AND вместо OR, он не будет отображать какие-либо элементы, если вы включите фильтр, и только избранное, когда вы выключите фильтр.

Если вы действительно предпочитаете использовать оператор AND && вместо ИЛИ || вам нужно будет проверить, является ли ориентир не избранным, и включен ли фильтр, не соответствует действительности.

if !(self.userData.showFavoritesOnly && !landmark.isFavorite) {
    // code
}
0 голосов
/ 22 февраля 2020

Согласно L aws

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

Де Моргана * Итак, подход Льва Табуса верен, но я думаю, что преобразование выражения добавляет сложности к коду. И отрицание всего выражения с двумя отрицаниями в выражении затрудняет понимание того, каким будет результат. Лично я предпочитаю выражения типа

if foo == false {}

, потому что оно больше похоже на предложение по сравнению с

if !foo {}

, которое, однако, короче.

В конце я нахожу

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

гораздо более интуитивно понятнее и проще для понимания, особенно при попытке найти ошибку после полуночи и 10-часового рабочего дня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...