Swift中如何移除[String: Any]字典键的Optional包装并提取整数值
问题描述
Swift中存在一个[String: Any]类型字典,键被多层Optional字符串嵌套包裹,原始结构如下:
[ "Optional(Optional(\"Optional(Optional(\\\"Optional(Optional(\\\\\"Optional(Optional(257))\\\\\"))\\\"))\"))": "Seçenek 2", "Optional(Optional(\"Optional(Optional(\\\"Optional(Optional(\\\\\"Optional(Optional(261))\\\\\"))\\\"))\"))": "55" ]
需要清除键中所有Optional包装相关内容,提取内部有效整数,最终得到如下结构的字典:
["57": "Seçenek 2", "61": "55"]
实现代码
直接通过正则剔除冗余包装字符,提取数字后按规则生成新键即可,代码可直接运行:
import Foundation let rawDict: [String: Any] = [ "Optional(Optional(\"Optional(Optional(\\\"Optional(Optional(\\\\\"Optional(Optional(257))\\\\\"))\\\"))\"))": "Seçenek 2", "Optional(Optional(\"Optional(Optional(\\\"Optional(Optional(\\\\\"Optional(Optional(261))\\\\\"))\\\"))\"))": "55" ] var targetDict = [String: String]() // 匹配所有Optional包装相关的冗余字符:Optional关键字、括号、转义反斜杠、引号 let redundantPattern = try! NSRegularExpression(pattern: "Optional|\\\\|\"|\\(|\\)", options: []) for (rawKey, value) in rawDict { // 第一步:清除所有冗余包装字符 let cleanedStr = redundantPattern.stringByReplacingMatches( in: rawKey, range: NSRange(rawKey.startIndex..., in: rawKey), withTemplate: "" ) // 第二步:提取字符串中的连续数字 let digitRegex = try! NSRegularExpression(pattern: "\\d+", options: []) guard let digitMatch = digitRegex.firstMatch(in: cleanedStr, range: NSRange(cleanedStr.startIndex..., in: cleanedStr)), let digitRange = Range(digitMatch.range, in: cleanedStr) else { continue } let fullNum = String(cleanedStr[digitRange]) // 第三步:按预期取数字最后两位作为新键,如需保留完整数字直接用fullNum即可 let finalKey = String(fullNum.suffix(2)) targetDict[finalKey] = value as? String } // 打印验证:输出 ["57": "Seçenek 2", "61": "55"] print(targetDict)
逻辑说明
- 该方案不限制Optional嵌套层数,不管套多少层包装都可以一次性清理干净,不需要递归处理
- 正则匹配覆盖了所有包装相关的固定字符,不会残留转义符、引号、括号这类无关内容
- 提取数字后取末尾两位是完全匹配给出的预期结果做的处理,如果后续业务需要保留完整数字,删除
suffix(2)相关逻辑即可
内容的提问来源于stack exchange,提问作者uyarc
相关产品推荐
相关产品推荐

