на какие типы можно добавить функциональность с помощью расширения swift

[Перевод] 10 расширений Swift, которые мы используем на Livefront

на какие типы можно добавить функциональность с помощью расширения swift

Привет, Хабр. Перевод подготовлен в рамках онлайн-курса «iOS Developer. Basic».Приглашаем всех желающих на бесплатный двухдневный интенсив «Создание простейшего приложения без единой строчки кода». В первый день узнаем:1. Что такое XCode? 2. Как «рисуются экраны» 3. Добавим на экраны кнопки и поля ввода. Создадим экран авторизации. 4. Создадим второй экран нашего приложения и добавим переход на него из окна авторизации. Зарегистрироваться можно здесь.

Добавьте в Swift свою собственную изюминку

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

Если вы новичок в Swift, пожалуйста, обратитесь к

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

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

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

Стремясь к тому, чтобы содержание ниже было относительно кратким, я не включил в описание наши юнит-тесты.

Xcode Playground, используемый в этой статье, на моей странице GitHub.

Вот только 10 из многих расширений, которые мы используем в Livefront.

1. UIView — Ограничения

Добавление ограничений к UIView

Создание объекта Date из строки в часовом поясе UTC

3. String (Строка) — получение URL-адресов

Получить действительные URL-адреса из строки

Этот хелпер-метод очень удобен, когда у вас есть несколько URL в заданной строке. Я бы настоятельно рекомендовал написать несколько юнит-тестов, чтобы убедиться, что этот метод извлекает предполагаемые URL-адреса для вашего конкретного JSON-ответа.

4. UIStackView — удаление представлений

Удаление всех subviews из UIStackView

5. Bundle — Версия приложения и номер сборки

Получить версию приложения и номер сборки

6. Календарь — предыдущий год

Определение прошлого года по типу Integer

Здесь все довольно прямолинейно. Метод вернет предыдущий год в виде Integer.

7. UIStackView — Удобство Init

Удобство Init (инициализация) чтобы упростить создание

8. UIColor — Hex

Получение Hex (шестнадцатеричного) значения UIColor

9. UIViewController — Темный режим

Проверьте, включен ли темный режим

10. UICollectionView — Последний IndexPath

Получить последний indexPath для collectionView

Резюме

Я бы сказал, что практически невозможно создать проект без добавления хотя бы одного расширения. Добавление функциональности с помощью расширений делает Swift более мощным и позволяет создавать новые функции безопасным способом. Я советую вам поискать в Интернете «Расширения Swift» и получить удовлетворение от всех творческих решений, которые придумали наши коллеги-разработчики.

Не стесняйтесь поделиться своим любимым расширением (расширениями) в комментарии ниже.

Источник

10 расширений Swift, которые мы используем на Livefront

Привет, Хабр. Перевод подготовлен в рамках онлайн-курса «iOS Developer. Basic».

Приглашаем всех желающих на бесплатный двухдневный интенсив «Создание простейшего приложения без единой строчки кода». В первый день узнаем:

1. Что такое XCode?
2. Как «рисуются экраны»
3. Добавим на экраны кнопки и поля ввода. Создадим экран авторизации.
4. Создадим второй экран нашего приложения и добавим переход на него из окна авторизации.
Зарегистрироваться можно здесь.

Добавьте в Swift свою собственную изюминку

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

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

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

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

Стремясь к тому, чтобы содержание ниже было относительно кратким, я не включил в описание наши юнит-тесты.

Вы можете найти Xcode Playground, используемый в этой статье, на моей странице GitHub.

Вот только 10 из многих расширений, которые мы используем в Livefront.

1. UIView — Ограничения

Добавление ограничений к UIView

Создание объекта Date из строки в часовом поясе UTC

3. String (Строка) — получение URL-адресов

Получить действительные URL-адреса из строки

Этот хелпер-метод очень удобен, когда у вас есть несколько URL в заданной строке. Я бы настоятельно рекомендовал написать несколько юнит-тестов, чтобы убедиться, что этот метод извлекает предполагаемые URL-адреса для вашего конкретного JSON-ответа.

4. UIStackView — удаление представлений

Удаление всех subviews из UIStackView

5. Bundle — Версия приложения и номер сборки

Получить версию приложения и номер сборки

6. Календарь — предыдущий год

Определение прошлого года по типу Integer

Здесь все довольно прямолинейно. Метод вернет предыдущий год в виде Integer.

7. UIStackView — Удобство Init

Удобство Init (инициализация) чтобы упростить создание

8. UIColor — Hex

Получение Hex (шестнадцатеричного) значения UIColor

9. UIViewController — Темный режим

Проверьте, включен ли темный режим

10. UICollectionView — Последний IndexPath

Получить последний indexPath для collectionView

Резюме

Я бы сказал, что практически невозможно создать проект без добавления хотя бы одного расширения. Добавление функциональности с помощью расширений делает Swift более мощным и позволяет создавать новые функции безопасным способом. Я советую вам поискать в Интернете «Расширения Swift» и получить удовлетворение от всех творческих решений, которые придумали наши коллеги-разработчики.

Не стесняйтесь поделиться своим любимым расширением (расширениями) в комментарии ниже.

Ресурсы:

Ограничения типов с помощью расширений

Узнать подробнее о курсе «iOS Developer. Basic»

Участвовать в интенсиве «Создание простейшего приложения без единой строчки кода»

Источник

Extensions¶

Extensions add new functionality to an existing class, structure, enumeration, or protocol type. This includes the ability to extend types for which you don’t have access to the original source code (known as retroactive modeling). Extensions are similar to categories in Objective-C. (Unlike Objective-C categories, Swift extensions don’t have names.)

Extensions in Swift can:

Extensions can add new functionality to a type, but they can’t override existing functionality.

Extension Syntax¶

Declare extensions with the extension keyword:

An extension can extend an existing type to make it adopt one or more protocols. To add protocol conformance, you write the protocol names the same way as you write them for a class or structure:

If you define an extension to add new functionality to an existing type, the new functionality will be available on all existing instances of that type, even if they were created before the extension was defined.

Computed Properties¶

Extensions can add computed instance properties and computed type properties to existing types. This example adds five computed instance properties to Swift’s built-in Double type, to provide basic support for working with distance units:

These computed properties express that a Double value should be considered as a certain unit of length. Although they’re implemented as computed properties, the names of these properties can be appended to a floating-point literal value with dot syntax, as a way to use that literal value to perform distance conversions.

Extensions can add new computed properties, but they can’t add stored properties, or add property observers to existing properties.

Initializers¶

Extensions can add new initializers to existing types. This enables you to extend other types to accept your own custom types as initializer parameters, or to provide additional initialization options that were not included as part of the type’s original implementation.

Extensions can add new convenience initializers to a class, but they can’t add new designated initializers or deinitializers to a class. Designated initializers and deinitializers must always be provided by the original class implementation.

If you use an extension to add an initializer to a structure that was declared in another module, the new initializer can’t access self until it calls an initializer from the defining module.

You can extend the Rect structure to provide an additional initializer that takes a specific center point and size:

If you provide a new initializer with an extension, you are still responsible for making sure that each instance is fully initialized once the initializer completes.

Methods¶

Extensions can add new instance methods and type methods to existing types. The following example adds a new instance method called repetitions to the Int type:

After defining this extension, you can call the repetitions(task:) method on any integer to perform a task that many number of times:

Mutating Instance Methods¶

The example below adds a new mutating method called square to Swift’s Int type, which squares the original value:

Subscripts¶

Extensions can add new subscripts to an existing type. This example adds an integer subscript to Swift’s built-in Int type. This subscript [n] returns the decimal digit n places in from the right of the number:

Nested Types¶

Extensions can add new nested types to existing classes, structures, and enumerations:

The nested enumeration can now be used with any Int value:

Copyright © 2021 Apple Inc. All rights reserved.

Swift and the Swift logo are trademarks of Apple Inc.

Источник

10 расширений Swift, которые мы используем на Livefront

Приглашаем всех желающих на бесплатный двухдневный интенсив «Создание простейшего приложения без единой строчки кода». В первый день узнаем:

1. Что такое XCode?
2. Как «рисуются экраны»
3. Добавим на экраны кнопки и поля ввода. Создадим экран авторизации.
4. Создадим второй экран нашего приложения и добавим переход на него из окна авторизации.
Зарегистрироваться можно здесь.

на какие типы можно добавить функциональность с помощью расширения swift

Добавьте в Swift свою собственную изюминку

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

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

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

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

Стремясь к тому, чтобы содержание ниже было относительно кратким, я не включил в описание наши юнит-тесты.

Вы можете найти Xcode Playground, используемый в этой статье, на моей странице GitHub.

Вот только 10 из многих расширений, которые мы используем в Livefront.

1. UIView — Ограничения

Добавление ограничений к UIView

Создание объекта Date из строки в часовом поясе UTC

3. String (Строка) — получение URL-адресов

Получить действительные URL-адреса из строки

Этот хелпер-метод очень удобен, когда у вас есть несколько URL в заданной строке. Я бы настоятельно рекомендовал написать несколько юнит-тестов, чтобы убедиться, что этот метод извлекает предполагаемые URL-адреса для вашего конкретного JSON-ответа.

4. UIStackView — удаление представлений

Удаление всех subviews из UIStackView

5. Bundle — Версия приложения и номер сборки

Получить версию приложения и номер сборки

6. Календарь — предыдущий год

Определение прошлого года по типу Integer

Здесь все довольно прямолинейно. Метод вернет предыдущий год в виде Integer.

7. UIStackView — Удобство Init

Удобство Init (инициализация) чтобы упростить создание

8. UIColor — Hex

Получение Hex (шестнадцатеричного) значения UIColor

9. UIViewController — Темный режим

Проверьте, включен ли темный режим

10. UICollectionView — Последний IndexPath

Получить последний indexPath для collectionView

Резюме

Я бы сказал, что практически невозможно создать проект без добавления хотя бы одного расширения. Добавление функциональности с помощью расширений делает Swift более мощным и позволяет создавать новые функции безопасным способом. Я советую вам поискать в Интернете «Расширения Swift» и получить удовлетворение от всех творческих решений, которые придумали наши коллеги-разработчики.

Не стесняйтесь поделиться своим любимым расширением (расширениями) в комментарии ниже.

Источник

Расширения добавляют новые функциональные возможности к существующему классу, структуре, перечислению или типу протокола. Это включает в себя возможность расширять типы, для которых у вас нет доступа к исходному исходному коду (известный как ретроактивное моделирование ). Расширения аналогичны категориям в Objective-C. (В отличие от категорий Objective C, расширения Swift не имеют имен.)

Расширения в Swift могут:

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

Расширения могут добавлять новые функциональные возможности к типу, но они не могут переопределять существующие функциональные возможности.

Синтаксис расширения

Объявите расширения с extension ключевым словом:

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

Расширение может использоваться для расширения существующего универсального типа. Вы также можете расширить универсальный тип для условного добавления функциональности.

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

Вычисленные свойства

Эти вычисленные свойства выражают, что Double значение следует рассматривать как определенную единицу длины. Хотя они реализованы как вычисляемые свойства, имена этих свойств могут быть добавлены к литеральному значению с плавающей точкой с синтаксисом точки, чтобы использовать это литеральное значение для выполнения преобразований расстояния.

Эти свойства являются вычисляемыми свойствами только для чтения, поэтому get для краткости они выражаются без ключевого слова. Их возвращаемое значение имеет тип Double и может использоваться в математических вычислениях везде, где Double принимается:

Расширения могут добавлять новые вычисляемые свойства, но они не могут добавлять сохраненные свойства или добавлять наблюдатели свойств к существующим свойствам.

Инициализаторы

Расширения могут добавлять новые инициализаторы к существующим типам. Это позволяет вам расширять другие типы, чтобы принимать ваши собственные пользовательские типы в качестве параметров инициализатора, или предоставлять дополнительные параметры инициализации, которые не были включены как часть первоначальной реализации типа.

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

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

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

Поскольку Rect структура предоставляет значения по умолчанию для всех своих свойств, она автоматически получает инициализатор по умолчанию и инициализатор по элементам. Эти инициализаторы могут быть использованы для создания новых Rect экземпляров:

Вы можете расширить Rect структуру, чтобы обеспечить дополнительный инициализатор, который принимает определенную центральную точку и размер:

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

Методы

Расширения могут добавлять новые методы экземпляров и методы типов к существующим типам. В следующем примере добавляется новый метод экземпляра, вызываемый repetitions для Int типа:

После определения этого расширения вы можете вызвать repetitions(task:) метод для любого целого числа, чтобы выполнить задачу много раз:

Методы мутации экземпляров

Нижние индексы

Вложенные типы

Расширения могут добавлять новые вложенные типы к существующим классам, структурам и перечислениям:

Вложенное перечисление теперь можно использовать с любым Int значением:

Эта функция printIntegerKinds(_:) принимает входной массив Int значений и перебирает эти значения по очереди. Для каждого целого числа в массиве функция рассматривает kind вычисленное свойство для этого целого числа и печатает соответствующее описание.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *