【问题标题】:How to reduce an array in swift based on some condition如何根据某些条件快速减少数组
【发布时间】:2017-02-17 16:52:14
【问题描述】:

对于我面临的以下问题,我需要知道 Swift 中的一个好的解决方案。

我有一个声明为var dataArray = [PlanModel]() 的模型数组。

class PlanModel: {

var isPurchased:String?
var planName:String?
}

现在我从服务器获取数据并用模型填充dataArraydataArray 包含 3 个模型。模型的价值是:

模型 1:

isPurchased = "true"
planName = "Question"

模型 2:

isPurchased = "true"
planName = "Personal"

模型 3:

isPurchased = "false"
planName = "Full"

我需要通过检查isPurchased 的值来检查是否购买了该计划来减少此数组。如果为真则从数组中删除,如果为假,则将其保留在数组中。

请告诉我在 Swift 中更简单有效的方法是什么?

【问题讨论】:

  • 如果isPurchasednil 怎么办?还是"????"?为什么该属性是可选的?为什么它是字符串而不是布尔值?
  • 同意 Martin R,如果它的全部是真或假,你应该使用布尔类型而不是字符串
  • Martin R 是绝对正确的.....你应该使用布尔类型而不是字符串类型
  • @MikeAlter:不。您可以毫无问题地在空数组上调用过滤器。

标签: ios arrays swift


【解决方案1】:

你可以使用filter函数

var reducedArray = dataArray.filter {$0.isPurchased == "false"}

这将检查dataArray 的每个元素,如果元素isPurchased"false",它将保留它

【讨论】:

  • 谢谢@Fonix。简单的例子。
【解决方案2】:

您可以将filtercontains 函数一起使用

模型类:

class PlanModel {

    var isPurchased:String?
    var planName:String?

    init(isPurchased:String?, planname:String?) {
        self.isPurchased = isPurchased
        self.planName = planname
    }
}

override func viewDidLoad() {
        super.viewDidLoad()

        var plan = [PlanModel]()            
        plan.append(PlanModel(isPurchased: "true", planname: "Question"))
        plan.append(PlanModel(isPurchased: "true", planname: "Personal"))
        plan.append(PlanModel(isPurchased: "false", planname: "Full"))

        // Filter function
        plan = plan.filter {
            ($0.isPurchased?.contains("false"))!
        }
        print(plan.count)
        // 1
}

【讨论】:

  • contains()== 有什么优势?
【解决方案3】:

创建过滤函数:

func notPurchased(planModel: PlanModel) -> Bool{
   return planModel.isPurchased == "false"
}

并使用传入你的函数的数组过滤函数

let filteredArray = dataArray.filter(notPurchased)

【讨论】:

    【解决方案4】:

    在发布我的解决方案后,让我告诉你,最好将 isPurchased 类型从 String 更改为 Bool。

    现在……

    class PlanModel 
    {
    
        var isPurchased:String?
        var planName:String?
    }
    
    let p1: PlanModel = PlanModel()
    p1.isPurchased = "true"
    p1.planName = "Question"
    
    let p2: PlanModel = PlanModel()
    p2.isPurchased = "true"
    p2.planName = "Personal"
    
    let p3: PlanModel = PlanModel()
    p3.isPurchased = "false"
    p3.planName = "Full"
    
    var plans: [PlanModel] = [ p1, p2, p3 ]
    
    // Filter elements with `isPurchased` property
    // set to `true`. As isPurchased is marked as an
    // `Optional` type I check that it's not nil before
    // process it
    plans = plans.filter()
    { 
        guard let isPurchased = $0.isPurchased else 
        { 
            return false 
        } 
    
        return isPurchased == "true" 
    }
    
    
    plans.forEach()
    { 
        if let planName = $0.planName
        {
            print(planName)
        }
        else
        {
            print("unnamed")
        }
    }
    

    【讨论】:

      【解决方案5】:

      由于您正在寻找从数组本身中删除满足特定条件的项目,因此您可以执行以下代码:

      dataArray = dataArray.filter({ $0.isPurchased == "False"})
      

      我发现这是最好的方法之一,我使用的是 Swift 3

      现在在旁注中,我建议使用 structs 而不是模型的类

      【讨论】:

      • 并不是最好的方法。如果删除了多个元素,这将崩溃 ...
      猜你喜欢
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2019-10-18
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      相关资源
      最近更新 更多