web-dev-qa-db-fra.com

Comment créer Swift classe pour la catégorie?

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

Toute idée si la catégorie existe dans Swift? Ou comment obtenir une fonctionnalité similaire dans Swift??

84
Khawar

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

Elles 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 de nouvelles fonctionnalités à 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 ne travaillent pas seulement avec les classes, mais aussi avec d'autres types.

À l'heure actuelle, les extensions peuvent:

  • Ajouter des propriétés calculées et des propriétés statiques calculées
  • Définir des méthodes d'instance et des méthodes de type
  • Fournir de nouveaux initialiseurs
  • Définir les 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 documentation d’Apple pour plus d’informations sur l’utilisation des extensions dans Swift.

126
Cezar

Dans l'Objectif C, elles s'appelaient catégories , mais dans Swift, elles s'appellent extensions . Elles ont toutes deux pour but de fournir des fonctionnalités supplémentaires aux classes existantes sans avoir à créer des sous-classes.

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

Voici un résumé tiré de la vidéo sur la façon de le faire.

Ajouter un fichier Swift à votre projet

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

  • Sélectionnez "Fichier Swift"

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

Écrivez le code pour l'extension

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

Vous devriez importer UIKit (au lieu de Foundation) si vous étendez un UIView. Ensuite, utilisez le mot clé extension avant le nom de la classe à étendre. Vous pouvez ensuite ajouter vos propres nouvelles méthodes à la classe. (Remarque: les extensions servent à ajouter de nouvelles méthodes, sans remplacer les méthodes existantes - d'où le nom.)

Dans la vidéo, l'exemple consistait à ajouter une méthode qui découpe 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, comme si 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 cropToCircleWithBorderColor n'est pas une partie standard de UIImage, mais comme vous pouvez le constater, elle est utilisée telle quelle.

Pour complément d'étude:

99
Suragch

Dans Swift il s'appelle Extensions ! jetez un coup d'œil

8
iSofTom

Vous pouvez utiliser le code suivant dans votre classe existante

extension name{
func funcName(){
   } 
}
0
vikrant tanwar