Как создать быстрый класс для категории?

84

Я хочу создать категорию своего существующего быстрого класса, но в IDE нет возможности сделать это.

Есть идеи, существует ли категория в быстром проекте? Или как добиться аналогичной функциональности в быстром проекте?

Khawar
источник
2
он позвонил extension.
holex

Ответы:

128

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

Они несколько отличаются от категорий Objective-C, в основном:

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

На сегодняшний день расширения могут:

  • Добавить вычисленные свойства и вычисленные статические свойства
  • Определите методы экземпляра и методы типов
  • Предоставьте новые инициализаторы
  • Определить индексы
  • Определите и используйте новые вложенные типы
  • Сделать существующий тип совместимым с протоколом

Базовый синтаксис объявления расширения выглядит следующим образом:

extension SomeType {
    // new functionality to add to SomeType goes here
}

Обратитесь к документации Apple, чтобы узнать больше о том, как использовать расширения в Swift.

Цезарь
источник
99

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

Я читал о расширениях в документации, но я толком не понимал, как использовать их в своем проекте, пока не посмотрел это обучающее видео ( версия на YouTube , исходники на github ).

Вот краткое изложение того, как это сделать.

Добавьте файл Swift в свой проект

  • Щелкните правой кнопкой мыши в "Навигаторе проекта" и выберите "Новый файл ..."

  • Выберите "Swift File"

  • Соглашение заключается в том, чтобы сохранить имя файла как имя класса, который вы расширяете, плюс (со знаком «+») то, что вы с ним делаете. Например, «UIImage + Cropping».

Напишите код для расширения

Откройте только что созданный новый файл Swift.

Вам следует импортировать UIKit(вместо Foundation), если вы расширяете UIView. Затем используйте extensionключевое слово перед именем класса, который вы хотите расширить. Затем вы можете добавить в класс свои собственные новые методы. (Обратите внимание, расширения предназначены для добавления новых методов, а не для переопределения существующих методов - отсюда и название.)

В видео примером было добавление метода, который вырезает круг из изображения и придает ему границу.

import UIKit

extension UIImage {
    
    func cropToCircleWithBorderColor(color: UIColor, lineWidth: CGFloat) -> UIImage {
        
        // code to create the cropped circle with colored border
        
        return newImage
    }
}

См. Здесь полный пример.

Используйте свое расширение в любом месте вашего проекта

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

Вот пример видео ( на github ):

import UIKit
class ViewController: UIViewController {
                            
    @IBOutlet var imageView : UIImageView = nil
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let img = imageView.image
        imageView.image = img.cropToCircleWithBorderColor(UIColor(red:0.91, green:0.34, blue:0.16, alpha:1.00), lineWidth: 20)
    }
}

Метод cropToCircleWithBorderColorне является стандартной частью UIImage, но, как видите, используется так же, как и раньше.

Для дальнейшего изучения:

Suragch
источник
8

В Swift это называется Extensions ! Проверить это

iSofTom
источник
Но extensions не может включать переменные, которые меняют ситуацию.
RnMss
Даже в категориях Objective-C не может быть переменных (без хаков).
Валентин Шергин
Объекты, связанные с ObjC, не являются
взломами
0

Вы можете использовать следующий код в своем существующем классе

extension name{
func funcName(){
   } 
}
Викрант Танвар
источник