检索id并将其递增swift3

时间:2017-06-02 18:06:53

标签: ios swift xcode

我有一个格式为1223-3939-ABC.1的ID,我想检索最后一个值,即1并增加它,所以它现在看起来像1223-3939-ABC.2。但它可能是" 1"在那种情况下不存在,我想附加" .1"

我试图在Swift中实现这一点,这是我的代码:

var deviceId: String = "1234-ASCD-SCSDS.1"

    if (deviceId != "") {
        var id: [String] = deviceId.components(separatedBy: ".")
        if let incrementedId: String = id.capacity > 1 ? deviceId.components(separatedBy: ".")[1] : "" {
            if (incrementedId == "") {
                //should append to id
                var firstEle = deviceId.components(separatedBy: ".")[0]
                firstEle.append(".")
                firstEle.append("1")
                deviceId = firstEle
            } else {
                // retrieve that id, convert to int, increment id, convert back to string and replace the old id with new id
                let newId: Int = Int(deviceId.components(separatedBy: ".")[1])! + 1
                deviceId = deviceId.replacingOccurrences(of: ".\\d", with: ".\(newId)", options: .regularExpression)
            }
        }
}

不确定我做错了什么?

2 个答案:

答案 0 :(得分:2)

  1. 您要替换的正则表达式为.\\d,其中.实际上是任何符号。将其替换为\\.\\d,它将按预期运行。
  2. 您正在引用capacity,但您需要引用count来了解组件数量。
  3. 基于documentation

      

    容量 - 数组可以包含的元素总数   分配新存储。

答案 1 :(得分:1)

有几个问题,例如

  • 错误使用capacity(正如尼基塔所说),
  • 您的代码假定只有一个点,因此id 有两个要素。
  • 如果点后面没有整数,则代码将崩溃。

主要问题是

deviceId = deviceId.replacingOccurrences(of: ".\\d", with: ".\(newId)", options: .regularExpression)

替换所有出现的任意字符后跟 任何带有".\(newId)"的数字。应该是

deviceId = id[0] + ".\(newId)"

代替。

但整个问题可以更容易解决:

  • 找到最后一个点。
  • 检查点后面的字符串部分是否可以转换为整数。
  • 如果是,请用增加的整数替换该部分,否则追加.1

这两项检查都可以通过条件绑定来实现,这样就可以了 仅当设备ID已经有尾随时才执行if-block 号:

var deviceId = "1234-ASCD-SCSDS.1"
if let pos = deviceId.range(of: ".", options: .backwards),
    let id = Int(deviceId.substring(from: pos.upperBound)) {
    deviceId = deviceId.substring(to: pos.upperBound) + String(id + 1)
} else {
    deviceId = deviceId + ".1"
}
print(deviceId) // 1234-ASCD-SCSDS.2