【问题标题】:Sorted Array/Map Swift排序数组/映射 Swift
【发布时间】:2020-04-10 11:29:36
【问题描述】:

我执行了一个 GET 请求,并像这样将数据保存在 data

if let data: [MyMap] = response?.results {
   let var_to_sort = data
   self.generateStuff(var: var_to_sort)
}

MyMap 是一个可映射对象,定义如下:

class MyMap: NSCoding {
   var name: String?
   var score: Score?
   ...

通过映射、编码等... 分数同上:

class Score:NSCoding {
   var number: Double?
   ...

我需要的是根据数字(从大到小)对 var_to_sort = data 进行排序并将其传递给 generateStuff 方法。请记住 response.results 有多个对象。有人可以帮助我吗?

【问题讨论】:

  • 你试过什么,你读过Array的文档吗?

标签: ios swift xcode sorting nscoding


【解决方案1】:

只需对数组进行排序:

let var_to_sort = data.sorted {
  $0.score?.number ?? 0 > $1.score?.number ?? 0
}

【讨论】:

    【解决方案2】:

    我确实有一个可以满足您需求的可行解决方案。并且可能是一种通过在不需要时避免使用可选项来改进代码的方法。如果您的 Web 服务将始终为您的对象返回名称和分数,那么不要使用可选项,这将使您的生活更轻松。当我没有任何选项时,您可以在我的解决方案中看到代码更易于阅读并且这样的操作很简单。

    // -------------- Solution 1 avoiding optionals ----------------
    
    struct MyObject {
        var name: String
        var score: Score
    }
    
    struct Score {
        var number: Double
    }
    
    let data: [MyObject] = [MyObject(name: "obj1", score: Score(number: 12)),
                            MyObject(name: "obj2", score: Score(number: 2)),
                            MyObject(name: "obj3", score: Score(number: 24)),
                            MyObject(name: "obj4", score: Score(number: 4)),
                            MyObject(name: "obj5", score: Score(number: 1))]
    
    let sortedObj = data.sorted(by: { $0.score.number > $1.score.number })
    print(sortedObj)
    // Print: obj3, obj1, obj4, obj2 and obj5
    
    // -------------- Solution 2 using optionals ----------------
    
    struct MyObject2 {
        var name: String?
        var score: Score2?
    }
    
    struct Score2 {
        var number: Double?
    }
    
    let data2: [MyObject2] = [MyObject2(name: "obj1", score: Score2(number: 12)),
                              MyObject2(name: "obj2", score: Score2(number: 2)),
                              MyObject2(name: "obj3", score: Score2(number: 24)),
                              MyObject2(name: "obj4", score: Score2(number: 4)),
                              MyObject2(name: "obj5", score: Score2(number: 1))]
    
    let sortedObj2 = data2.sorted(by: {
        guard let num1 = $0.score?.number, let num2 = $1.score?.number else {
            return false
        }
        return num1 > num2
    })
    print(sortedObj2)
    // Print: obj3, obj1, obj4, obj2 and obj5
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      以这种方式对数组进行排序。

      data2.sort(by:{$0.score?.number > $1.score?.number})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多