我想如果可以将第一个字符过滤为字符串而将第二个字符过滤为Int?例如,我在数组上有M1: test M
和B2: test M
。
如果我使用此代码:
filter{$0.contains("M")
它会同时过滤M1
和B2
,因为在这两者中都有M
字符
我正在考虑是否有任何方法可以使用filter{$0.contains("M"+number)
这样的内容,因此只有在M
之后有一个数字时它才能过滤。
答案 0 :(得分:0)
您可以映射分割由":"
分隔的组件的字符串。添加一个保护来过滤以所需字母开头的结果元素前缀,删除该前缀的第一个字符并将结果字符串强制转换为Int:
let array = ["M1: test","M2: test", "B2: test"]
let values: [Int] = array.flatMap {
guard
let prefix = $0.components(separatedBy: ":").first,
prefix.first == "M" else { return nil }
return Int(prefix.dropFirst()) ?? 0
}
print(values) // "[1, 2]\n"
如果你需要对它们进行分组并修剪空格:
let array = ["M1: test"," M2: test", "B2: test"]
let results = array.flatMap{ string -> (letter: String, value: Int, note: String)? in
guard
case let components = string.components(separatedBy: ":"),
let prefix = components.first?.trimmingCharacters(in: .whitespaces),
let suffix = components.last?.trimmingCharacters(in: .whitespaces),
let letter = prefix.first else { return nil }
return (String(letter), Int(prefix.dropFirst()) ?? 0, suffix)
}
print(results) // "[(letter: "M", value: 1, note: "test"), (letter: "M", value: 2, note: "test"), (letter: "B", value: 2, note: "test")]\n"
如果您只需要具有预览" M":
的元素let filtered = array.filter { $0.hasPrefix("M") }
print(filtered) // "["M1: test", "M2: test"]\n"\n"
答案 1 :(得分:0)