【问题标题】:How to increment String in Swift如何在 Swift 中增加字符串
【发布时间】:2023-03-15 05:21:01
【问题描述】:

我需要按字母顺序保存文件。
现在我的代码按数字顺序保存文件

1.png
2.png
3.png
...

问题是当我再次阅读这些文件时,我按照here 的描述阅读了这些文件


因此,我正在考虑更改代码并将文件保存为不是按数字顺序而是按字母顺序为:

a.png
b.png
c.png
...
z.png
aa.png
ab.png
...

但在 Swift 中,即使是 Character 类型也很难递增。
我该如何开始:

var s: String = "a"

并以这种方式增加s

【问题讨论】:

  • 那么您想将这些数字名称映射到包含字母的名称吗?这与递增有什么关系?
  • 没有。这就是我现在保存文件的方式。我正在考虑按字母顺序保存文件,而不是现在的数字。我会尽力解释得更好。
  • I was thinking of saving the files in the alphabetical order instead of the numeric as it is now. ...所以您想将这些数字名称映射到包含字母的名称。
  • @Danny182 :你看过我的回答了吗?

标签: swift string sorting character


【解决方案1】:

你可以保持数字,只是在排序时使用正确的选项:

let arr = ["1.png", "19.png", "2.png", "10.png"]

let result = arr.sort {
    $0.compare($1, options: .NumericSearch) == .OrderedAscending
}

// result: ["1.png", "2.png", "10.png", "19.png"]

【讨论】:

    【解决方案2】:

    将此代码粘贴到 Playground 并检查结果。 n 支持数字意味着您可以输入任何高数字,例如 99999999999999 享受!

    您可以取消注释for loop 代码以检查代码是否正常工作 但不要忘记为 counter 变量分配较小的值,否则 Xcode 将冻结。

    var fileName:String = ""
    var counter = 0.0
    var alphabets = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
    let totalAlphaBets = Double(alphabets.count)
    let numFiles = 9999
    
    
    func getCharacter(counter c:Double) -> String {
    
        var chars:String
        var divisionResult = Int(c / totalAlphaBets)
        let modResult = Int(c.truncatingRemainder(dividingBy: totalAlphaBets))
    
        chars = getCharFromArr(index: modResult)
    
        if(divisionResult != 0){
    
            divisionResult -= 1
    
            if(divisionResult > alphabets.count-1){
                chars = getCharacter(counter: Double(divisionResult)) + chars
            }else{
                chars = getCharFromArr(index: divisionResult) + chars
            }
        }
    
        return chars
    }
    
    func getCharFromArr(index i:Int) -> String {
        if(i < alphabets.count){
            return alphabets[i]
        }else{
            print("wrong index")
            return ""
        }
    }
    
    for _ in 0...numFiles {
        fileName = getCharacter(counter: counter)+".png"
        print(fileName)
        counter += 1
    }
    
    fileName = getCharacter(counter: Double(numFiles))+".png"
    print(fileName)
    

    【讨论】:

      【解决方案3】:

      如果您真的想让它们按字母顺序排列,请尝试使用以下代码来增加名称:

      /// Increments a single `UInt32` scalar value
      func incrementScalarValue(_ scalarValue: UInt32) -> String {
          return String(Character(UnicodeScalar(scalarValue + 1)))
      }
      
      /// Recursive function that increments a name
      func incrementName(_ name: String) -> String {
          var previousName = name
          if let lastScalar = previousName.unicodeScalars.last {
              let lastChar = previousName.remove(at: previousName.index(before: previousName.endIndex))
              if lastChar == "z" {
                  let newName = incrementName(previousName) + "a"
                  return newName
              } else {
                  let incrementedChar = incrementScalarValue(lastScalar.value)
                  return previousName + incrementedChar
              }
          } else {
              return "a"
          }
      }
      
      var fileNames = ["a.png"]
      for _ in 1...77 {
          // Strip off ".png" from the file name
          let previousFileName = fileNames.last!.components(separatedBy: ".png")[0]
          // Increment the name
          let incremented = incrementName(previousFileName)
          // Append it to the array with ".png" added again
          fileNames.append(incremented + ".png")
      }
      
      print(fileNames)
      // Prints `["a.png", "b.png", "c.png", "d.png", "e.png", "f.png", "g.png", "h.png", "i.png", "j.png", "k.png", "l.png", "m.png", "n.png", "o.png", "p.png", "q.png", "r.png", "s.png", "t.png", "u.png", "v.png", "w.png", "x.png", "y.png", "z.png", "aa.png", "ab.png", "ac.png", "ad.png", "ae.png", "af.png", "ag.png", "ah.png", "ai.png", "aj.png", "ak.png", "al.png", "am.png", "an.png", "ao.png", "ap.png", "aq.png", "ar.png", "as.png", "at.png", "au.png", "av.png", "aw.png", "ax.png", "ay.png", "az.png", "ba.png", "bb.png", "bc.png", "bd.png", "be.png", "bf.png", "bg.png", "bh.png", "bi.png", "bj.png", "bk.png", "bl.png", "bm.png", "bn.png", "bo.png", "bp.png", "bq.png", "br.png", "bs.png", "bt.png", "bu.png", "bv.png", "bw.png", "bx.png", "by.png", "bz.png"]`
      

      你最终会得到

      a.png
      b.png
      c.png
      ...
      z.png
      aa.png
      ab.png
      ...
      zz.png
      aaa.png
      aab.png
      ...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-09
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        • 2014-08-02
        • 2023-03-03
        • 2021-11-09
        相关资源
        最近更新 更多