2016-07-28 5 views
2

En Objective-C Je suis utilisé pour déclarer des propriétés qui se connectent à Interface Builder avecUne propriété IBOutlet doit-elle être marquée nullable ou non?

@property (nonatomic, weak) IBOutlet UIView *myView; 

Maintenant, j'ai une classe qui utilise les nouveaux attributs de XCode-nullité. Pour préserver la compatibilité avec Swift, quel attribut nullability devrait avoir un IBOutlet? Selon « Using Swift with Cocoa and Objective-C » Apple:

Lorsque vous déclarez une prise à Swift, vous devez faire une option non emballé implicitement le type de sortie. De cette façon, vous pouvez laisser le storyboard connecter les prises à l'exécution, après l'initialisation. Lorsque votre classe est initialisée à partir d'un fichier storyboard ou xib, vous pouvez supposer que la prise a été connectée.

Cela signifie-t-il que la sortie doit être déclarée nonnull en Objective-C?

+0

Les propriétés sans annotation de nullité sont importées en tant qu'options non dépliées implicitement. Le rendre 'nonnull' l'importerait comme non-optionnel. Votre 'IBOutlet's devrait être déclaré dans votre fichier .m de toute façon, peu importe ce que vous annotez avec. – dan

Répondre

5

Si votre classe est écrite dans Swift, vous ne pouvez pas utiliser une propriété non facultative, sinon le compilateur va se plaindre que la propriété n'est jamais initialisée. C'est pourquoi Apple recommande de le déclarer comme un optionnel implicitement déballé, car une fois que votre objet a été initialisé, vous savez avec certitude que la propriété contient une valeur (sauf si vous avez une sortie pendante, ce qui peut arriver ...)

Lors de l'exportation à partir d'Objective-C, vous pouvez le marquer comme nonnull et il apparaîtra dans Swift comme une propriété non facultative, ce qui est correct dans ce cas. Notez que vous ne pouvez pas utiliser à la fois nonnull et weak.

Vous pouvez faire:

@property (nonatomic, strong, nonnull) IBOutlet UIView *subview; 
// Exported to Swift as @IBOutlet var subview: UIView 

ou

@property (nonatomic, weak, nullable) IBOutlet UIView *subview; 
// Exported to Swift as @IBOutlet weak var subview: UIView? 

Si pour une raison quelconque, vous voulez toujours la propriété à exporter vers Swift en option non emballés implicitement, vous pouvez marquer la propriété comme null_resettable ou null_unspecified. Ce n'est pas vraiment ce à quoi ils sont destinés mais cela produira toujours le résultat souhaité. Voir this blog post pour plus d'informations sur ces annotations.

@property (nonatomic, weak, null_unspecified) IBOutlet UIView *subview; 
// Exported to Swift as @IBOutlet weak var subview: UIView! 
1

La déclaration de weak implique que la propriété est nullable. Par conséquent, cela fonctionne

@property (nonatomic, weak, nullable) IBOutlet UIView *contentView; 

Déclarant la propriété nonnull donne une erreur.