我可以在阵列上将第一个字符过滤为字符串,将第二个字符过滤为Int吗?

时间:2017-11-07 21:54:17

标签: arrays swift filter

我想如果可以将第一个字符过滤为字符串而将第二个字符过滤为Int?例如,我在数组上有M1: test MB2: test M

如果我使用此代码:

filter{$0.contains("M")

它会同时过滤M1B2,因为在这两者中都有M字符

我正在考虑是否有任何方法可以使用filter{$0.contains("M"+number)这样的内容,因此只有在M之后有一个数字时它才能过滤。

2 个答案:

答案 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)

尝试使用此功能。假设您的值数组是命名数据,请在冒号处拆分每个值。取第一个子串并检查“M”。如果找到则返回true,否则为false。

let data = ["M1: test M", "B2: test M", "M21: test A"]
let result = data.filter { $0.split(separator: ":").first?.contains("M") ?? false }

enter image description here