1

J'essaie de créer une «usine d'étiquettes» qui m'aidera à produire des étiquettes pour un projet.Syntaxe pour l'appel de plusieurs paramètres par défaut

J'ai une fonction

getLabel(of type: LabelTypeEnum, 
         _ labelTitle: String? = nil, 
         _ textColor: UIColor? = nil, 
         _ textAlignment: NSTextAlignment? = nil) -> Label 

Je veux alors appeler avec un certain nombre de paramètres, par exemple:

getLabel(of: .myLabel, .center) 

qui se traduit par l'erreur: '? String' "Type Comment est-ce que je dis au compilateur que .center n'est pas la propriété labelTitle?

J'ai essayé de spécifier le contenu en ajoutant "alignment: .center" mais cela me force à le supprimer.

Si c'est utile, j'adapterai le contexte du code ci-dessous.

static func getLabel(of type: LabelType, 
          _ labelTitle: String? = nil, 
          _ textColor: UIColor? = nil, 
          _ textAlignment: NSTextAlignment? = nil) -> Label { 
     switch type { 

     case .regular: 
      return RegularLabel(labelTitle, textColor, textAlignment) 

     case .title: 
      return TitleLabel(labelTitle, textColor, textAlignment) 
     case .description: 
      return DescriptionLabel(labelTitle, textColor, textAlignment) 
     case .header: 
      return HeaderLabel(labelTitle, textColor, textAlignment) 

     case .subHeader: 
      return SubHeaderLabel(labelTitle, textColor, textAlignment) 

     case .body: 
      return BodyLabel(labelTitle, textColor, textAlignment) 

     case .fatBody: 
      return FatBodyLabel(labelTitle, textColor, textAlignment) 

     case .smallGray: 
      return SmallGrayLabel(labelTitle, textColor, textAlignment) 
     } 
    } 

Étiquette d'initialisation

convenience init(_ title: String? = nil, _ color: UIColor? = nil, _ alignment: NSTextAlignment? = nil) { 
     self.init(frame: .zero) 
     self.text = title ?? self.text 
     self.textColor = color ?? self.textColor 
     self.textAlignment = alignment ?? self.textAlignment 
    } 

Un des nombreux appels

private lazy var titleLabel: UILabel = { 
     let label = LabelFactory.getLabel(of: .header, .center) 
     self.addSubview(label) 
     return label 
    }() 

Répondre

2

C'est la malédiction d'omettre les étiquettes des paramètres en raison de la commodité, cela est censé fonctionner:

getLabel(of type: LabelTypeEnum, 
     labelTitle: String? = nil, 
     textColor: UIColor? = nil, 
    textAlignment: NSTextAlignment? = nil) -> Label 

getLabel(of: .myLabel, textAlignment: .center)