检查可选数组是不是包含元素和显示视图

Posted

技术标签:

【中文标题】检查可选数组是不是包含元素和显示视图【英文标题】:Check if optional array contains element and display view检查可选数组是否包含元素和显示视图 【发布时间】:2022-01-10 15:08:35 【问题描述】:

在 SwiftUI 中,我通过 API 将对象提取到可选数组中。然后,在视图中,我尝试确定加载视图时该数组是否包含一组可能的元素。

如果数组包含该元素,我将为其显示一个单独的视图。如果不是,我不会显示它。

如何检查该可选数组是否包含特定元素?

例如,我想检查是否 projectType.landscapes?包含一个“覆盖”条目。此外,ProjectType.Landscapes.types 数组将包含与当前 projectType.landscape 选项相对应的字符串值,例如 ["mulching"、"clearing"、"treeCare"] 或只是 ["mulching"]。

这是我的数据结构:

// 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")
    

【问题讨论】:

有什么问题? 对不起,问题还不清楚。您询问数组是否包含元素的方式是使用(准备好)contains。有什么问题? @matt 我无法使用 contains 让它工作。它是数组中的数组。 ProjectType.landscapes 是一个数组,而 types 是该数组内的一个数组。它也是一个可选的,所以我不知道如何检查它。 先问问自己。你真的需要将你的数组声明为可选的吗?如果它们永远不会为零,那么将它们声明为可选是没有任何意义的。 @LeoDabus 是的,它们需要是可选的。它们可能确实为零。 【参考方案1】:

首先,您可以使用“可选绑定”方法,例如“if let”或“guard let”,或者简单地使用数组计数来确保数组具有值。 之后,您可以在 Array 上使用多个选项,例如 'contains(_:)' apple document

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

【讨论】:

你能用上面的数据结构写一个例子吗? @soroush_araste。如果我尝试:“ if ((projectType.landscapes?.contains(where: “mulching”)) != nil) MulchingView() “我收到此错误:无法将“String”类型的值转换为预期的参数类型“ (横向) throws -> Bool' if letlandScapes = project.landscapes if landScapes.contains(where: $0.mulching != nil) 成功了,谢谢。 不客气。

以上是关于检查可选数组是不是包含元素和显示视图的主要内容,如果未能解决你的问题,请参考以下文章

展开可选 JSON 元素会使应用程序崩溃 [重复]

Scrollview 只显示我在 swift 3 中使用情节提要创建的视图中的最后一个数组元素?

Swift 3:通过遍历视图数组来设置视图

在 Rails 中使用视图检查数组

在 Rails 中使用条件显示视图元素

Console.log 将我的元素显示为数组而不是元素