Як створити швидкий клас для категорії?


84

Я хочу створити категорію мого існуючого швидкого класу, але в IDE немає можливості зробити це.

Будь-яка ідея, чи існує категорія у швидкому проекті? Або як досягти подібної функціональності в швидкому проекті?


2
це закликало extension.
holex

Відповіді:


128

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

Вони відрізняються від категорій Objective-C кількома способами, головним чином:

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

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

  • Додайте обчислювані властивості та обчислювані статичні властивості
  • Визначте методи екземпляра та методи типу
  • Надайте нові ініціалізатори
  • Визначте індекси
  • Визначте та використовуйте нові вкладені типи
  • Зробіть існуючий тип відповідним протоколу

Основний синтаксис для оголошення розширення такий:

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

Перегляньте документацію Apple, щоб отримати додаткову інформацію про те, як використовувати розширення в Swift.


99

У цілі C їх називали категоріями , а в Swift - розширеннями . Мета обох - надати додаткову функціональність існуючим класам без необхідності створювати підкласи.

Я читав про розширення в документації, але я насправді не розумів, як використовувати їх у своєму проекті, поки не переглянув це навчальне відео ( версія YouTube , джерело github ).

Ось короткий виклад з відео про те, як це зробити.

Додайте файл Swift до свого проекту

  • Клацніть правою кнопкою миші в Навігаторі проектів і виберіть "Новий файл ..."

  • Виберіть "Швидкий файл"

  • Домовленість полягає в тому, щоб зберегти ім'я файлу як ім'я класу, який ви розширюєте плюс (зі знаком "+"), що ви з ним робите. Наприклад, "UIImage + Обрізання".

Напишіть код розширення

Відкрийте новий щойно створений файл Swift.

Вам слід імпортувати UIKit(замість Foundation), якщо ви розширюєте a 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, але, як бачите, він використовується так само, як і раніше.

Для подальшого вивчення:


8

У Swift це називається Extensions ! Перевір


Але extensionне можна включати змінні, які роблять речі абсолютно різними.
RnMss

Навіть у категоріях Objective-C не може бути змінних (без хаків).
Валентин Шергін

Об'єкти, пов'язані з ObjC, не є
хаками

0

Ви можете використовувати наступний код у своєму існуючому класі

extension name{
func funcName(){
   } 
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.