【问题标题】:Can I use a switch statement to transform each value in an array in Swift?我可以使用 switch 语句来转换 Swift 中数组中的每个值吗?
【发布时间】:2021-06-20 02:19:15
【问题描述】:

我想根据每个值在一个范围内的位置来转换数组的内容。范围标准似乎是最容易在 switch 语句中表示的东西,但我无法将它放在一起或在网上找到类似的示例。

我是初学者,所以请原谅任何明显的愚蠢,但这里有一个我尝试过的例子,应该是说明性的:

    var times = [3,12,4,9,17,22]

    var timeAdjustments: [Int] {
     for i in times {
      switch i {
       case 20...: 50
       case 15...: 70
       case 10...: 80
       case 5...: 90
       case 0...: 100
       default: print("out of range")
    }
    timeAdjustments.append(i)
}

在本例中,目标是返回如下数组:[100,80,100,90,70,50]。

【问题讨论】:

  • 而且范围是从零到无穷大?

标签: arrays swift switch-statement


【解决方案1】:

范围是正确的,但您实际上并没有对每种情况做任何事情。 您不需要将i 附加到timeAdjustment,而是附加每种情况下的值。因此,您可能希望将其分配给某个临时变量,然后附加它而不是 i

var timeAdjustments: [Int] = []

for i in times {
    var j: Int? = nil
    switch i {
    case 20...: j = 50
    case 15...: j = 70
    case 10...: j = 80
    case 5...: j = 90
    case 0...: j = 100
    default: print("out of range")
    }
    if let j = j { timeAdjustments.append(j) }
}

【讨论】:

  • 您的答案会起作用,但使用 map(或 compactMap,如 vadian 的答案)似乎更干净,更“迅速”。
  • @DuncanC,当然,但我正在优化可理解性,因为 OP 对 Swift 来说似乎相当新,所以我对他的代码保持关闭,以便他能看到差异。
  • 公平点。如果你想把它提升到一个新的水平,你可以在你的答案中添加第二部分,说“现在,Swift 中有一个名为 compactMap 的函数......”然后使用它作为第二个选项显示等效项。
【解决方案2】:

我的建议只是(compact)Map数组

let times = [3,12,4,9,17,22]

let timeAdjustments = times.compactMap { item -> Int? in
    switch item {
        case 20...: return 50
        case 15...: return 70
        case 10...: return 80
        case 5...: return 90
        case 0...: return 100
        default : print("\(item) is out of range"); return nil
    }
}

【讨论】:

    【解决方案3】:
        Please try the below mention solution:
        
       func getArray(inputArray : [Int])->[Int] {
        var timeAdjustments = [Int]()
        for i in inputArray {
            switch i {
            case 20...:
                timeAdjustments.append(50)
            case 15...:
                timeAdjustments.append(70)
            case 10...:
                timeAdjustments.append(80)
            case 5...:
                timeAdjustments.append(90)
            case 0...:
                timeAdjustments.append(100)
            default: print("out of range")
            }
        }
        return timeAdjustments
    }
        let times = [3,12,4,9,17,22]
        let resultedArray = getArray(inputArray: times)
        print("resulted array :\(resultedArray)")
        //resulted array :[100, 80, 100, 90, 70, 50]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      相关资源
      最近更新 更多