Swift中如何从Array<Any>数组中搜索指定字符串?
解决Array中搜索特定字符串的问题
首先修正你代码里的基础问题:
- 不能用
Array作为变量名(这是Swift关键字),建议换成itemsArray - 字符串字面量必须加双引号,比如
"Doe"、"john_doe@gmail.com" - 如果数组包含
nil,类型应声明为[Any?]而非[Any]
针对核心的「将Array
方案1:遍历数组逐个匹配
手动遍历数组,处理可选值和类型转换后进行匹配(支持忽略大小写,适合邮箱这类场景):
// 修正后的数组 let itemsArray: [Any?] = [1, "Doe", "John", "john_doe@gmail.com", "jdoe", "t", "03/11/2022 15:00:00", nil, 1] let stringToSearch = "John_doe@gmail.com" var termExists = false for item in itemsArray { // 先解包可选值,再尝试转为String guard let element = item, let elementStr = element as? String else { continue } // 忽略大小写比较 if elementStr.caseInsensitiveCompare(stringToSearch) == .orderedSame { termExists = true break } } NSLog(termExists ? "Term Exists" : "Can't find term")
方案2:用高阶函数简化代码
利用contains(where:)方法,用更简洁的写法实现相同逻辑:
let itemsArray: [Any?] = [1, "Doe", "John", "john_doe@gmail.com", "jdoe", "t", "03/11/2022 15:00:00", nil, 1] let stringToSearch = "John_doe@gmail.com" let exists = itemsArray.contains { item in guard let element = item, let str = element as? String else { return false } return str.caseInsensitiveCompare(stringToSearch) == .orderedSame } NSLog(exists ? "Term Exists" : "Can't find term")
补充说明
- 如果数组不含
nil,可去掉guard let element = item的解包步骤 - 需要精确大小写匹配时,把
caseInsensitiveCompare替换为直接的==即可 - 若要将数字、日期等非字符串类型转为对应字符串再搜索,可扩展转换逻辑:
guard let element = item else { continue } var elementStr: String? if let str = element as? String { elementStr = str } else if let num = element as? Int { elementStr = String(num) } else if let date = element as? Date { let formatter = DateFormatter() formatter.dateFormat = "dd/MM/yyyy HH:mm:ss" elementStr = formatter.string(from: date) } // 后续比较逻辑...
内容的提问来源于stack exchange,提问作者PAW
相关产品推荐
相关产品推荐

