web-dev-qa-db-fra.com

Les extensions peuvent ne pas contenir de propriétés stockées

Puis-je implémenter ceci dans Swift avec des extensions sans avoir besoin d'héritage?). Ce message d'erreur s'affiche. Les extensions peuvent ne pas contenir de propriétés stockées.

extension UIButton
{
    @IBInspectable var borderWidth : CGFloat
        {
        didSet{
            layer.borderWidth = borderWidth
        }
    }

}
30
Mohamed DiaaEldin

Vous pouvez remplacer le setter/getter de sorte qu'il ne s'agisse pas d'une propriété stockée et le transmettre simplement à la couche.

extension UIButton {
    @IBInspectable var borderWidth : CGFloat {
        set {
            layer.borderWidth = newValue
        }

        get {
            return layer.borderWidth
        }
    }
}
53
dan

Les extensions ne peuvent pas ajouter de propriétés stockées. Dans le docs (section Propriétés calculées):

Remarque

Les extensions peuvent ajouter de nouvelles propriétés calculées, mais elles ne peuvent pas ajouter de propriétés stockées ou ajouter des observateurs de propriété aux propriétés existantes.

Si vous avez besoin de propriétés stockées, vous devez créer une sous-classe, comme suit:

class CustomButton : UIButton
{
    @IBInspectable var borderWidth : CGFloat
        {
        didSet{
            layer.borderWidth = borderWidth
        }
    }

}
10
Alexander

Dans Swift, j'importe une bibliothèque statique écrite en Objective-C. Le protocole ci-dessous, dans cette bibliothèque, a une méthode et une propriété.

@class Message;

@protocol LocalService 

@property (readonly) int action;

- (Message *)getResponse:(Message *)request;

@end

Essayer d'avoir une classe conforme à ce protocole, transmet les messages ci-dessous:

1-) Le type 'ShowInitialViewLocalService' n'est pas conforme au protocole 'LocalService

2-) Les extensions ne peuvent pas contenir de propriétés stockées

Le code fourni ci-dessous corrige ce problème:

import UIKit

class ShowInitialViewLocalService: NSObject{

}

extension ShowInitialViewLocalService : LocalService {

    var action: Int32 {
        get { return View.InitialView.rawValue }
    }

    func getResponse(_ request: Message) -> Message {
        let response = Response(source: request.target, target: request.source, relatedView: View.InitialView.rawValue, action: request.action, data: request.data)
        return response
    }
}

J'espère que cela aidera quelqu'un.

3
Emre Gürses