Avant que je puisse décrire les cas d'utilisation pour Implicitement Déballé Options, vous devriez déjà comprendre ce que les Options et Implicitement Déballé Options sont en Swift. Si vous ne le faites pas, je vous recommande d'abord de lire mon article sur les options
Quand Utiliser Un Implicitement Déballé En Option
Il y a quatre raisons principales que l'on pourrait créer un Implicitement Déballé en Option. Tous ont à voir avec la définition d'une variable qui ne sera jamais accessible en nil
parce que sinon, la Swift compilateur va toujours vous forcer explicitement déballer une Option.
1. Une Constante Qui Ne Peut Être Défini Lors De L'Initialisation
Chaque membre de la constante doit avoir une valeur par le temps de l'initialisation est terminée. Parfois, une constante ne peut pas être initialisé à sa valeur correcte lors de l'initialisation, mais il peut encore être garanti d'avoir une valeur avant d'être consulté.
En utilisant une variable Optionnelle permet de contourner ce problème, car l'Option est automatiquement initialisé avec nil
et la valeur qu'elle peut éventuellement contenir sera toujours immuable. Cependant, il peut être une douleur à être constamment à déballer une variable que vous savez pour sûr, n'est pas nul. Implicitement Déballé Options de réaliser les mêmes prestations en Option avec l'avantage supplémentaire que l'on n'a pas explicitement déballer partout.
Un grand exemple de ceci est quand un membre de la variable ne peut pas être initialisé dans une sous-classe UIView jusqu'à ce que le point de vue est chargé:
class MyView : UIView {
@IBOutlet var button : UIButton!
var buttonOriginalWidth : CGFloat!
override func awakeFromNib() {
self.buttonOriginalWidth = self.button.frame.size.width
}
}
Ici, vous ne pouvez pas calculer la largeur d'origine de la touche jusqu'à ce que le point de vue des charges, mais vous savez qu' viewDidLoad
sera appelée avant toute autre méthode sur la vue (autres que l'initialisation). Au lieu de forcer la valeur à être explicitement déballé inutilement partout dans votre classe, vous pouvez le déclarer comme un Implicitement Déballé en Option.
2. L'interaction avec un Objectif-C API
Chaque référence à un objet en Objective-C est un pointeur, ce qui signifie qu'il peut être nil
. Ce qui signifie que chaque interaction avec un Objectif-C de l'API de Swift devez utiliser une option où il y a une référence à un objet. Vous pouvez utiliser une normale en Option dans chacun de ces cas, mais si vous savez certainement que la référence ne sera pas nil
, vous pouvez vous épargner de déballage de code en la déclarant comme Implicitement Déballé en Option.
Un bon exemple de ceci est une UITableViewDataSource
:
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell? { return nil }
Ici, vous savez que la méthode ne sera jamais appelé sans tableView
ou indexPath
. Ce serait une perte de temps de le vérifier pour nil
. Si c'était purement Swift API, un
ne serait pas la déclarer comme une Option.
3. Lorsque Votre Application Ne peut pas Récupérer à Partir d'une Variable nil
Ce doit être extrêmement rare, mais si votre application peut littéralement pas de continuer à exécuter si une variable est - nil
lors de l'accès, ce serait une perte de temps pour la peine de le tester pour nil
. Normalement, si vous avez une condition qui doit absolument être vrai pour votre application de fonctionner, vous pouvez utiliser un assert
. Un Implicitement Déballé en Option a une assertion sans intégré à.
4. NSObject Initialiseurs
Apple a au moins un cas étrange du Implicitement Déballé Options. Techniquement, tous les initialiseurs de classes qui héritent de NSObject
retour Implicitement Déballé Options. C'est parce que l'initialisation en Objective-C peut renvoyer nil
. Cela signifie que, dans certains cas, c'est que vous voulez toujours être en mesure de tester le résultat de l'initialisation de nil
. Un parfait exemple de cela est avec UIImage
si l'image n'existe pas:
var image : UIImage? = UIImage(named: "NonExistentImage")
if image != nil {
println("image exists")
}
else {
println("image does not exist")
}
Si vous pensez qu'il ya une chance que votre image n'existe pas et vous pouvez facilement traiter ce scénario, vous pouvez déclarer la variable qui reflète l'initialisation explicitement comme une Option de sorte que vous pouvez vérifier pour nil
. Vous pouvez également utiliser un Implicitement Déballé en Option ici, mais depuis que vous êtes planification pour le vérifier de toute façon, il est préférable d'utiliser un normal en Option.
Quand Ne Pas Utiliser Un Implicitement Déballé En Option
1. Paresseusement Membre Calculé Variables
Parfois, vous avez un membre de la variable ne doit jamais être nul, mais il ne peut pas être réglé à la valeur correcte lors de l'initialisation. Une solution consiste à utiliser un Implicitement Déballé en Option, mais une meilleure solution est d'utiliser un paresseux variable:
class FileSystemItem {
}
class Directory : FileSystemItem {
lazy var contents : [FileSystemItem] = {
var loadedContents = [FileSystemItem]()
// load contents and append to loadedContents
return loadedContents
}()
}
Maintenant, le membre de la variable contents
n'est pas initialisé jusqu'à ce que la première fois qu'il est accessible. Cela donne à la classe une chance d'obtenir dans le bon état avant le calcul de la valeur initiale.
Remarque: Cela peut sembler contredire #1 à partir de ci-dessus. Cependant, il est important de faire la distinction. L' buttonOriginalWidth
ci-dessus doit être défini lors de viewDidLoad pour empêcher quiconque de changer les boutons largeur de l'avant de la propriété est accessible.
2. Partout Ailleurs
Pour la plupart, Implicitement Déballé Options doit être évitée car si elle est utilisée à tort, l'ensemble de votre application crash quand il est accessible à tout nil
. Si vous êtes toujours pas sûr de savoir si une variable peut être nul, toujours par défaut à l'aide d'un normal en Option. Déballage d'une variable qui n'est jamais nil
certainement ne fait pas mal, très bien.