Сопоставление массива классов для удаления пробелов из значений swift

#arrays #swift #dictionary #struct #filter

#массивы #swift #словарь #структура #Фильтр

Вопрос:

У меня есть структура и массив моих структур следующим образом

 struct Products{
    var ProductType: String
    var ProductName: String
    var ProductLink: String
}

var CleaningProductsArray = [Products]()
 

Когда я пишу в свой массив структур, переменная ProductName внутри него иногда может быть записана пользователем с конечными пробелами. Я хотел бы вернуть версию CleaningProductsArray, но со всеми экземплярами ProductName, у которых удалены все конечные пробелы. Я пытался достичь этого с помощью map, как показано ниже, но не возвращает то, что я хотел бы. Какой наиболее эффективный способ сделать это?

 let trimmed = CleaningProductsArray.map{ $0.ProductName.trimmingCharacters(in: .whitespaces) }
 

Комментарии:

1. Обрезка пробелов — это проблема представления, ваша бизнес-логика не должна ничего об этом знать. К тому времени, когда вы создали Products модель, вы уже должны были очистить / проанализировать / отформатировать пользовательский ввод, чтобы остальной части вашего кода не приходилось беспокоиться об этом

2. Не связанный, но важный: Products должен быть единственным (он моделирует только один продукт), а соглашение Swift заключается в использовании lowerCamelCase для локальных переменных, свойств и т. Д. Кроме того, нет необходимости ставить перед каждым полем a префикс Product with Product . Мы знаем name , что это a ProductName , потому что оно принадлежит … a Product .

3. 1 за комментарий Александра о соглашениях об именовании. Эти соглашения очень сильны в Swift, и вы должны научиться им следовать.

Ответ №1:

Быстрый ответ:

 let trimmed: [Products] = CleaningProductsArray.map { product in
    var adjusted = product
    adjusted.ProductName = product.ProductName.trimmingCharacters(in: .whitespaces)
    return adjusted
}
 

Как было правильно упомянуто в комментариях, есть вещи, которые вы можете улучшить в своем общем дизайне кода.

Вы могли бы начать с преобразования вашей модели в соответствие со стандартами именования Swift, что означает отказ от использования множественного Products числа, поскольку объекты этого типа описывают один продукт, и удаление product префикса из свойств, поскольку из контекста очевидно, что они описывают «Продукт». В идеале вы также должны сделать свойства неизменяемыми, чтобы сделать их передачу более безопасной (google «Преимущества неизменности»). Вам следует создать какой-либо другой объект, отвечающий за сбор всех данных для ваших объектов продукта.

 struct Product {
    let type: String
    let name: String
    let link: String
}
 

Кроме того, вы никогда не должны использовать имена в верхнем регистре для ваших переменных / констант / свойств / функций в Swift, поэтому лучше заменить CleaningProductsArray на cleaningProductsArray для удобства чтения. Имена в верхнем регистре зарезервированы для типов. Также вы можете захотеть удалить Array суффикс, поскольку из типа очевидно, что это массив

 var cleaningProducts = [Product]()
let trimmed: [Product] = cleaningProducts.map {
    Product(
        type: $0.type,
        name: $0.name.trimmingCharacters(in: .whitespaces),
        link: $0.link
    )
}
 

Комментарии:

1. Я бы предпочел, чтобы обрезка выполнялась в Product.init as, тогда он всегда будет обрезать его, где бы он ни был создан, но все же разрешает приведенную выше карту и просто сайт вызова, Product(type: $0.type, name: $0.name, link: $0.link) хотя это изменение должно сделать эту карту ненужной.

2. Я считаю, что что-то еще должно обрабатывать обрезку, например, метод, который получает данные из текстового поля и присваивает их объекту Product . Init не должен обрабатывать такую логику.