Проверьте, содержит ли необязательный массив элемент и вид отображения

#arrays #swift #swiftui

#массивы #swift #swiftui

Вопрос:

В SwiftUI я извлекаю объекты через API в необязательный массив. Затем в представлении я пытаюсь определить, содержит ли этот массив набор возможных элементов при загрузке представления.

Если массив содержит этот элемент, я покажу для него отдельное представление. Если этого не произойдет, я не буду его показывать.

Как мне проверить, содержит ли этот необязательный массив определенный элемент?

Так, например, я хочу проверить, является ли ProjectType.landscapes? содержит запись «мульчирование». Кроме того, ProjectType .Массив Landscapes.types будет содержать строковые значения, соответствующие текущим параметрам ProjectType.landscape, например, [«мульчирование», «очистка», «Уход за деревьями»] или просто [«мульчирование»].

Вот моя структура данных:

 // MARK: - ProjectType
struct ProjectType: Codable {
    let landscapes: [Landscape]?
    let generalConstructions: [GeneralConstruction]?
}
// MARK: - GeneralConstruction
struct GeneralConstruction: Codable {
    let id: Int
}

// MARK: - Landscape
struct Landscape: Codable {
    let id: Int
    let types: [String]
    let mulching: Mulching?
    let clearing: Clearing?
    let planting: Planting?
    let treeCare: TreeCare?
    let other: Other?
}

// MARK: - Clearing
struct Clearing: Codable {
    let id: Int
    let clearingArea, removeTrees, treeCount, approxTreeHeight: String
    let treeStumps: String
}

// MARK: - Mulching
struct Mulching: Codable {
    let id: Int
    let mulchingType, currentlyInPlace, currentlyInPlaceCustom, roomLength: String
    let roomWidth, color, customColor, length: String
    let approximateLength: String
}

// MARK: - Other
struct Other: Codable {
    let id: Int
    let otherDetails: String
}

// MARK: - Planting
struct Planting: Codable {
    let id: Int
    let designPlan, treeLargerThanFiveFeet, plantCount: String
}

// MARK: - TreeCare
struct TreeCare: Codable {
    let id: Int
    let careDescription: String
}
 

Вот где я бы проверил, присутствуют ли типы ландшафта:

 import SwiftUI

struct LandscapeSpecificsView: View {
    
    let projectType: ProjectType
    
    var body: some View {
        VStack{
            Text("Here is the landscape specific project info.  I'll show mulching or clearing, or treeCare, etc.")
        }
        
    }
}

struct MulchingView: View {
    var body: some View {
        Text("Here is the mulching info")
    }
}

struct ClearingView: View {
    var body: some View {
        Text("Here is the clearing info")
    }
}

struct PlantingView: View {
    var body: some View {
        Text("Here is the planting info")
    }
}

struct TreeCareView: View {
    var body: some View {
        Text("Here is the treecare info")
    }
}

struct LandscapeOtherView: View {
    var body: some View {
        Text("Here is the landscape other info")
    }
}
 

Комментарии:

1. В чем вопрос?

2. Извините, вопрос все еще не ясен. Способ, которым вы спрашиваете, содержит ли массив элемент, с помощью (будьте готовы к этому) contains . В чем проблема?

3. @matt Я не могу заставить его работать, используя contains . Это массив в массиве. ProjectType.landscapes — это массив, а types — это массив внутри этого массива. Это также необязательно, поэтому я не уверен, как это проверить.

4. Сначала спросите себя. Вам действительно нужно объявлять свои массивы как необязательные? Если они никогда не будут равны нулю, нет никакого смысла объявлять их необязательными.

5. @LeoDabus да, они должны быть необязательными. Они действительно могут быть равны нулю.

Ответ №1:

во-первых, вы можете использовать методы «необязательной привязки», такие как «if let» или «guard let», или просто использовать array count, чтобы убедиться, что ваш массив имеет значение. после этого вы можете использовать несколько параметров для массива, например ‘содержит (_:)’ документ Apple

 if let landScapes = project.landscapes {
    if landScapes.contains(where: {$0.mulching != nil}) {
    
}
 

}

Комментарии:

1. Можете ли вы написать пример, используя структуру данных выше?

2. @soroush_araste. если я попытаюсь: » если ((ProjectType.landscapes? .содержит(где: «мульчирование»)) != ноль){ MulchingView() } » Я получаю эту ошибку: не удается преобразовать значение типа ‘String’ в ожидаемый тип аргумента ‘(Ландшафтный) throws -> Bool’

3. если let landScapes = project.landscapes { если landScapes.contains(где: {$0.мульчирование != ноль}) { } }

4. Это сработало, спасибо.

5. пожалуйста.