2017-05-22 2 views
2

J'écris un protocole qui a un label readOnly. Je veux l'étendre et lui donner une implémentation par défaut où le type conforme est UITextView.Comment puis-je étendre le protocole avec un ensemble privé?

code:

protocol CountingView { 

    var keyboardLabel : UILabel {get} 
} 

extension CountingView where Self : UITextView { 

    var keyboardLabel : UILabel { 
     get { 
      let label = UILabel() 
      label.textColor = UIColor.white 
      label.translatesAutoresizingMaskIntoConstraints = false 

      return label 
     } 
     private (set) { 
     keyboardLabel = newValue 
     } 
    } 
} 

Cependant quand j'ajoute le private avant la set je reçois l'erreur suivante.

attendu 'get', 'set', 'willSet', ou un mot clé 'didSet' pour commencer une définition accesseur

Je levais les yeux questions avec cette erreur mais n'a pas trouvé les liés au mien.

+2

Extensions * * ne peut pas ajouter des propriétés stockées. Votre setter s'appellera récursivement. Comparez https://stackoverflow.com/questions/44063181/protocol-extension-in-swift-3. –

+0

@MartinR ummm. D'ACCORD. Vous voulez dire que les réponses sont incorrectes? – Honey

+0

Eh bien, votre * question * est de savoir comment faire une compilation 'private (set)' *. * Les réponses semblent correctes. Mon point est que même si vous le faites compiler, votre * implémentation * du setter «keyboardLabel = newValue» ne fonctionnera pas comme prévu. –

Répondre

4

Vous avez juste le privé au mauvais endroit:

private(set) var keyboardLabel : UILabel { 
    get { 
     let label = UILabel() 
     label.textColor = UIColor.white 
     label.translatesAutoresizingMaskIntoConstraints = false 

     return label 
    } 
    set { 
     keyboardLabel = newValue 
    } 
} 
0

Il suffit de faire votre propriété calculée private comme ceci:

public private(set) var keyboardLabel : UILabel { 
    get { 
     let label = UILabel() 
     label.textColor = UIColor.white 
     label.translatesAutoresizingMaskIntoConstraints = false 

     return label 
    } 

    set { 
     keyboardLabel = newValue 
    } 
}