У меня есть такой словарь
["Price": ["$00.00 - $200.00", "$200.00 - $400.00", "$600.00 - $800.00"]]
Теперь я сохраняю все значения словаря в массиве, подобном этому
var priceRange: [String] = [String]()
if let obj = currentFilters["Price"] as? [String] {
self.priceRange = obj
printD(self.priceRange)
}
И с помощью метода Array.first и Array.last я получу значения первого и последнего элемента моего массива.
let first = priceRange.first ?? "" // will get("[$00.00 - $200.00]")
let last = priceRange.last ?? "" // will get("[$600.00 - $800.00]")
Но на самом деле я хочу, чтобы $ 00.00 из первый и 800 долл. США из последний образовали желаемую комбинацию [00–800 долларов].
Как я могу это сделать. Пожалуйста помоги?





Вы можете сделать следующее:
let r = ["$00.00 - $200.00", "$200.00 - $400.00", "$600.00 - $800.00"]
.reduce("", +) //Combine all strings
.components(separatedBy: " - ") //Split the result
.map({ String($0) }) //Convert from SubString to String
print(r.first) //prints $00.00
print(r.last) // prints $800.00
let newRange = [r.first!, r.last!].joined(separator: " - ")
@wings просто форматирует новую строку первым и последним так, как вы этого хотите.
Обновлено в соответствии с вашими требованиями @wings
@ CZ54 Сэр, можно использовать ! в этом коде, потому что иногда я не получаю значения
Я предполагаю, что ваш массив не пуст, иначе ваш диапазон - ""
Вы можете использовать split, чтобы разделить диапазон на основе символа -, чем удалить пробелы.
let first = priceRange.first?.split(separator: "-").first?.trimmingCharacters(in: .whitespaces) ?? ""
let last = priceRange.last?.split(separator: "-").last?.trimmingCharacters(in: .whitespaces) ?? ""
// используем компоненты (separatedBy :):
пусть цены = f.components (разделены знаком: "-")
price.first // 600,00 $
price.last // $ 800.00
Вы также можете использовать String.components (separatedBy :):
var text = "100$ - 200$"
var new = text.components(separatedBy: " - ")[0]
print(new) // Prints 100$
Вам нужно взять значение first ("$00.00 - $200.00"), затем значение last ("$600.00 - $800.00"), затем разделить их по символу «-», взять первое и последнее значения соответственно и объединить их в одну строку.
let currentFilters = ["Price": ["$00.00 - $200.00", "$200.00 - $400.00", "$600.00 - $800.00"]]
var priceRange: [String] = [String]()
if let obj = currentFilters["Price"] as? [String] {
priceRange = obj
print(priceRange)
}
let first = priceRange.first!.split(separator: "-").first!
let last = priceRange.last!.split(separator: "-").last!
let range = "\(first) - \(last)"
Для лучшей обработки опций вы можете использовать это (NB, я следую своему чрезмерно описательному стилю кодирования. Этот код может быть намного более компактным)
func totalRange(filters: [String]?) -> String? {
guard let filters = filters else { return nil }
guard filters.isEmpty == false else { return nil }
guard let startComponents = priceRange.first?.split(separator: "-"), startComponents.count == 2 else {
fatalError("Unexpected Filter format for first filter") // or `return nil`
}
guard let endComponents = priceRange.last?.split(separator: "-"), endComponents.count == 2 else {
fatalError("Unexpected Filter format for last filter") // or `return nil`
}
return "\(startComponents.first!) - \(endComponents.last!)"
}
let range = totalRange(filters: currentFilters["Price"])
let range1 = totalRange(filters: currentFilters["Not Exists"])
Вставьте приведенный выше код на игровую площадку. Его можно написать намного короче, но я оставил его таким для наглядности.
Сэр, что, если мой словарь пуст
Если ваш словарь пуст, мой код приведет к сбою вашего приложения :). Это было сделано, чтобы продемонстрировать способ достижения желаемого поведения. Обработка необязательных значений является предметом дальнейшей реализации.
Как я могу справиться с этим
let amountsArray = ["$00.00 - $200.00", "$200.00 - $400.00", "$600.00 - $800.00"]
let amounts = amountsArray.reduce("") { $0 + $1 }.split(separator: "-")
if let first = amounts.first, let last = amounts.last {
print("[\(first)-\(last)]")
}
Вы получаете дополнительный "", когда разделяете с "-".
Вы правы, @RakeshaShastri. Спасибо..!! Я обновил ответ
Да проверил, но не понял, где не так. Он печатает 00–800 долларов США.
Виноват. Теперь все в порядке. Хотя я должен напомнить вам, что OP хочет, чтобы это было так: "[$ 00.00 - $ 800.00.]" Так что вы можете захотеть отформатировать свой результат. :)
Обновил ответ :)
func priceRange(with priceRanges: [String]) -> String? {
guard
let min = priceRanges.first?.components(separatedBy: " - ").first,
let max = priceRanges.last?.components(separatedBy: " - ").last else { return nil }
return "[\(min) - \(max)]"
}
print(priceRange(
with: [
"$00.00 - $200.00",
"$200.00 - $400.00",
"$600.00 - $800.00"
]
))
Используйте это Вы можете найти свои значения:
if let obj = priceRange as? [String] {
let max = priceRange.max()
let min = priceRange.min()
print(max?.components(separatedBy: " - ").map({$0.trimmingCharacters(in: .whitespacesAndNewlines)}).max()) //800
print(min?.components(separatedBy: " - ").map({$0.trimmingCharacters(in: .whitespacesAndNewlines)}).min()) //00
}
но сэр, используя их, я получу 00.00 и 800.00, но я действительно хочу [00.00 - 800.00 $]