#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
withProduct
. Мы знаемname
, что это aProductName
, потому что оно принадлежит … aProduct
.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 не должен обрабатывать такую логику.