Как поместить первый и последний элемент массива в Swift

У меня есть такой словарь

["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 долларов].

Как я могу это сделать. Пожалуйста помоги?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
2 434
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Вы можете сделать следующее:

  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: " - ")

но сэр, используя их, я получу 00.00 и 800.00, но я действительно хочу [00.00 - 800.00 $]

Wings 05.11.2018 10:32

@wings просто форматирует новую строку первым и последним так, как вы этого хотите.

Rakesha Shastri 05.11.2018 10:34

Обновлено в соответствии с вашими требованиями @wings

CZ54 05.11.2018 10:36

@ CZ54 Сэр, можно использовать ! в этом коде, потому что иногда я не получаю значения

Wings 05.11.2018 10:42

Я предполагаю, что ваш массив не пуст, иначе ваш диапазон - ""

CZ54 05.11.2018 10:46

Вы можете использовать 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"])

Вставьте приведенный выше код на игровую площадку. Его можно написать намного короче, но я оставил его таким для наглядности.

Сэр, что, если мой словарь пуст

Wings 05.11.2018 10:50

Если ваш словарь пуст, мой код приведет к сбою вашего приложения :). Это было сделано, чтобы продемонстрировать способ достижения желаемого поведения. Обработка необязательных значений является предметом дальнейшей реализации.

fewlinesofcode 05.11.2018 10:53

Как я могу справиться с этим

Wings 05.11.2018 11:06
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)]")
}

Вы получаете дополнительный "", когда разделяете с "-".

Rakesha Shastri 05.11.2018 11:16

Вы правы, @RakeshaShastri. Спасибо..!! Я обновил ответ

Sateesh Yemireddi 05.11.2018 11:21

Да проверил, но не понял, где не так. Он печатает 00–800 долларов США.

Sateesh Yemireddi 05.11.2018 11:26

Виноват. Теперь все в порядке. Хотя я должен напомнить вам, что OP хочет, чтобы это было так: "[$ 00.00 - $ 800.00.]" Так что вы можете захотеть отформатировать свой результат. :)

Rakesha Shastri 05.11.2018 11:28

Обновил ответ :)

Sateesh Yemireddi 05.11.2018 12:49
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
}

Другие вопросы по теме