Для новичков в Swift концепция расширения типа может быть новой, поэтому я решил поделиться общим обзором расширений Swift в стиле вопроса 5 W: Кто? Какие? Когда? Где? Почему?

ВОЗ

«Разработчики Swift» — довольно очевидный ответ, но вот несколько сценариев, которые вы можете задать себе, чтобы узнать, можете ли вы использовать расширения Swift:

  • «Я полагаюсь на типы, которые можно найти в сторонних фреймворках или библиотеках, и мне хотелось бы добавить немного функциональности, которой нет из коробки. Могу ли я сделать это легко?»
  • «Используя фреймворки Apple, я обнаружил, что тип мог бы быть более мощным, если бы он мог просто делать [x]. Могу ли я добавить эту мощь к типу фреймворка Apple?»
  • «Я написал фреймворк для себя/моей команды, который используется в нескольких приложениях, но я хочу добавить поведение к одному из типов фреймворка, которое актуально только в определенной области одного конкретного приложения. Могу ли я добавить эту специальную функциональность, не меняя исходный код фреймворка?»

Если вы связаны с каким-либо или всеми этими сценариями, вы потенциально можете использовать расширения Swift, чтобы ускорить рабочий процесс и сделать его более организованным и чистым. Читайте дальше!

Что

Расширения добавляют новые функции к существующему классу, структуре или типу перечисления.
Справочник разработчика Apple Swift

Ключевое слово — существующий. Надеемся, что сценарии, перечисленные в разделе «Кто», имеют немного больше смысла с учетом этой информации. Во всех этих случаях вы хотите добавить функциональность к типам, которые уже разработаны и реализованы.

Что мне показалось удивительным в расширениях Swift, так это то, что слово «существующий» также применяется к типам, для которых у вас нет доступа к исходному коду. Это мощно!

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

Когда

Самое логичное время для использования расширений Swift — это когда у вас есть часть функциональности, которую вы хотите иметь возможность повторно использовать, и самое разумное место для размещения этого кода — в уже существующем Type. В идеале часть функциональности настолько тесно связана с этим Типом, что имеет смысл расширить поведение этого Типа, включив в него вашу новую функциональность… «Если бы только я мог заглянуть внутрь реализация этого типа для внедрения моего нового кода», — думаете вы про себя.

Если вы размышляете в этом направлении, то, скорее всего, расширения Swift помогут вам в ваших усилиях по созданию более пригодного для повторного использования, чистого и организованного кода.

Возможно, здесь уместно задать вопрос «Когда нет. Когда я вижу такие фразы, как «наиболее разумное место для размещения этого кода», возникает вопрос: «Что означает «наиболее разумное»?». Ответ не черно-белый. Я предложу то, что я сделал в прошлом, в качестве общего совета:

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

Если вы реализуете набор поведения (более чем несколько методов или вычисляемых свойств), наиболее подходящим будет создание нового типа для инкапсуляции этого поведения. В конце концов, именно это делают классы и структуры. При выборе между расширением и новым типом ключевым словом, которое приходит мне на ум, является связанность. Насколько связано это поведение с типом, который я хочу расширить?

Кроме того, расширения ограничены в области сохранения состояния. Расширения не могут добавлять новые хранимые свойства (только вычисляемые). Создание нового типа для инкапсуляции сохраненных свойств и поведения, которое их использует, является вашим альтернативным решением в этом случае.

Где

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

Поэтому, если я хочу расширить, скажем, String, чтобы иметь новый метод с именем «sayHello», который печатал бы «Hello» при вызове, я бы создал новый файл .swift с именем StringExtensions.swift. Затем я поместил бы свое расширение внутрь:

extension String { func sayHello() { println("Hello") } }

Эй, круто — вы получили бонус How с этим быстрым примером! Создать расширение в Swift настолько просто.

Почему

  • Расширения Swift являются мощными. Они позволяют добавлять поведение в любой класс, структуру или перечисление, даже если у вас нет доступа к исходному коду.
  • Их просто и удобно создавать.
  • Они поощряют повторное использование кода, инкапсулируя поведение, которое будет использоваться более одного раза в вашем проекте в одном месте.
  • Кроме того, они способствуют хорошей организации кода, что приводит к более чистому и удобочитаемому коду при добавлении поведения, тесно связанного с типом, который они расширяют.

Резюме

Мы только что изучили расширения Swift, проанализировав, кто должен их использовать, что они представляют собой, когда они подходят, где, чтобы поместить их, и почему они полезны для ваших усилий по разработке. В качестве бонуса в качестве простого примера было приведено как запрограммировать расширение.

Если вы обнаружили, что расширения Swift полезны для ваших усилий по разработке, расскажите об этом в комментариях ниже! Я хотел бы услышать, как вы используете эту функцию Swift.

Первоначально опубликовано на www.andrewcbancroft.com 3 ноября 2014 г.

Эндрю Бэнкрофт — автор нескольких курсов по iOS/Swift на Pluralsight. Он регулярно ведет блоги на www.andrewcbancroft.com и www.dataday.life, увлечен обучением и открытиями и с удовольствием делится новыми идеями с другими. Эндрю пишет в Твиттере о разработке программного обеспечения и науке о данных как @andrewcbancroft.