Comment créer une classe rapide pour la catégorie?

84

Je veux créer une catégorie de ma classe swift existante, mais il n'y a pas d'option dans l'IDE pour le faire.

Une idée si la catégorie existe dans le projet swift? Ou comment obtenir des fonctionnalités similaires dans un projet rapide?

Khawar
la source
2
il a appelé extension.
holex

Réponses:

128

Dans Swift, vous pouvez utiliser Extensionspour ajouter de nouvelles fonctionnalités aux classes, structures et types d'énumération existants.

Ils diffèrent des catégories Objective-C de plusieurs manières, principalement:

  • Ils ne sont pas nommés
  • Vous n'avez pas besoin d'importer explicitement une extension. Si vous définissez une extension pour ajouter une nouvelle fonctionnalité à un type existant, la nouvelle fonctionnalité sera disponible sur toutes les instances existantes de ce type, même si elles ont été créées avant la définition de l'extension.
  • Comme indiqué ci-dessus, ils fonctionnent non seulement avec les classes, mais également avec d'autres types.

Dans l'état actuel des choses, les extensions peuvent:

  • Ajouter des propriétés calculées et des propriétés statiques calculées
  • Définir les méthodes d'instance et les méthodes de type
  • Fournir de nouveaux initialiseurs
  • Définir des indices
  • Définir et utiliser de nouveaux types imbriqués
  • Rendre un type existant conforme à un protocole

La syntaxe de base pour déclarer une extension est la suivante:

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

Consultez la documentation d' Apple pour plus d'informations sur l'utilisation des extensions dans Swift.

Cezar
la source
99

En Objective C, elles étaient appelées catégories , mais en Swift, elles sont appelées extensions . Le but des deux est de donner des fonctionnalités supplémentaires aux classes existantes sans avoir à créer de sous-classes.

J'avais lu sur les extensions dans la documentation, mais je ne comprenais pas vraiment comment en utiliser une dans mon projet avant de regarder ce tutoriel vidéo ( version YouTube , source github ).

Voici un résumé tiré de la vidéo expliquant comment le faire.

Ajouter un fichier Swift à votre projet

  • Faites un clic droit dans le navigateur de projet et choisissez "Nouveau fichier ..."

  • Sélectionnez "Swift File"

  • La convention consiste à enregistrer le nom du fichier sous le nom de classe que vous étendez plus (avec un signe «+») ce que vous lui faites. Par exemple, "UIImage + Cropping".

Écrivez le code de l'extension

Ouvrez le nouveau fichier Swift que vous venez de créer.

Vous devez importer UIKit(au lieu de Foundation) si vous étendez un fichier UIView. Utilisez ensuite le extensionmot - clé avant le nom de la classe que vous souhaitez étendre. Vous pouvez ensuite ajouter vos propres nouvelles méthodes à la classe. (Notez que les extensions servent à ajouter de nouvelles méthodes, pas à remplacer les méthodes existantes - d'où le nom.)

Dans la vidéo, l'exemple consistait à ajouter une méthode qui recadre un cercle de l'image et lui donne une bordure.

import UIKit

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

Voir ici pour l'exemple complet.

Utilisez votre extension n'importe où dans votre projet

Vous pouvez maintenant utiliser votre nouvelle méthode pour cette classe n'importe où dans votre code, tout comme elle faisait partie de la classe standard.

Voici l'exemple de la vidéo ( sur 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)
    }
}

La méthode cropToCircleWithBorderColorn'est pas une partie standard de UIImage, mais comme vous pouvez le voir, elle est utilisée comme elle l'était.

Pour complément d'étude:

Suragch
la source
8

Dans Swift, cela s'appelle Extensions ! Vérifiez-le

iSofTom
la source
Mais extensions ne peut pas inclure de variables, qui rendent les choses totalement différentes.
RnMss
Même dans les catégories Objective-C ne peut pas avoir de variables (sans hacks).
Valentin Shergin
Les objets associés à ObjC ne sont pas des hacks
malhal
0

Vous pouvez utiliser le code suivant dans votre classe existante

extension name{
func funcName(){
   } 
}
Vikrant Tanwar
la source