web-dev-qa-db-fra.com

Pourquoi la propriété text d'UITextField a-t-elle été changée en option dans Swift 2?

Selon le document diff UIKit , dans ios9/Swift 2

var text: String! est devenu var text: String?

Selon le documentation pour UITextField il dit spécifiquement

This string is @"" by default.

Je ne comprends pas le but de ce changement. Cette propriété ne devrait-elle pas toujours être une chaîne vide si le champ de texte existe? À quel moment ce champ renvoie-t-il une chaîne vide? Une fois que l'utilisateur interagit avec lui? Une fois qu'il a été ajouté à la hiérarchie des vues? À quel moment renvoie-t-il nil?

Si le champ de texte existe en premier lieu, est-il toujours sûr de supposer que la propriété de texte existe également? Il semble que cela va conduire à beaucoup de recherche/remplacement .text à .text!

Je ne vois pas où cela est mentionné dans les documents, alors peut-être que quelqu'un a des antécédents ou de l'aide pour expliquer pourquoi cela a changé.

43
Will

Bref, (réponse au titre) ce n'était pas le cas.

En détail:

Pour moi, il est beaucoup plus logique de l'avoir en option qui ne soit pas forcément dépliée. Apple pousse les développeurs à ne jamais utiliser simplement optional! et il est logique qu'ils appliquent les mêmes règles aux API.

La raison en est qu'il peut être nul, et cela ne fait aucune différence s'il est déclaré avec ? ou ! pour exécuter le code. En utilisant ! supprime simplement les avertissements dans Xcode qui sont vraiment pratiques, surtout en ce qui concerne le code API. Si vous ne réalisez pas qu'il s'agit en fait d'une option, vous demandez simplement des ennuis.

La vérification de zéro est également beaucoup plus agréable maintenant avec guard et vous pouvez l'enchaîner avec une vérification de "" donc ce n'est pas vraiment plus de travail.

En général, les options sont meilleures parce que quelque chose de nul n'utilise pas de mémoire. Plus nous avons d'options, plus nous pouvons rendre nos applications plus légères. De plus, cela n'a même pas l'air mauvais et n'ajoute rien à la pyramide de Doom.

Cet exemple prendra les deux chaînes comme arguments, supprimez le ? dans le paramètre func et Xcode sera là pour vous avertir.

J'ai oublié de répondre directement à cette partie: Il devient nul lorsque vous le définissez sur nil, ce que vous pourriez faire pour économiser un peu de mémoire. Cela n'a tout simplement pas de sens d'avoir la possibilité de le définir sur nil et de ne pas avoir xcode vous avertir de le gérer correctement. => C'est impossible ...

var forcedUnwrappedString : String! = ""
var optionalString : String? = ""

forcedUnwrappedString = nil
optionalString = nil

func doSomethingWithString(string : String?) -> String? {
    guard var unwrappedString = string else {
        // error handling here
        return nil
    }
    let tempString = unwrappedString + "!"

    return tempString
}

func doSomethingUnsafeWithString(string : String) -> String {

    let tempString = string
    return tempString

}

var newString = doSomethingWithString(optionalString)
var newString2 = doSomethingWithString(forcedUnwrappedString)

newString = doSomethingUnsafeWithString(optionalString!) // this will crash without a warning fro xcode
newString2 = doSomethingUnsafeWithString(forcedUnwrappedString) // this will crash without a warning fro xcode

Mise à jour:

La propriété text de UITextfield a un setter qui définit toujours "" en cas de nil, aucune information à ce sujet dans les documents ou dans les fichiers UIKit .h.

var textField = UITextField(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
var string = textField.text // string = ""
textField.text = nil
string = textField.text // string = ""
16
R Menke

Un moyen simple de contourner ce problème consiste à créer une extension pour UITextField et à l'utiliser à la place de la propriété .text.

extension UITextField {
    var unwrappedText: String {
        return self.text ?? ""
     }
}

Vous pouvez maintenant dire textfield.unwrappedText sans vous soucier des options. (Bien sûr, c'est juste pour lire la valeur).

7
sgib

Comme Menke l'a mentionné lui-même, il est en fait impossible de mettre text à zéro. De toute évidence Apple veut qu'il soit documenté comme nullable, malgré l'implémentation actuelle, et pour moi cela n'a aucun sens - je veux dire n'a pas assez de sens pour moi. La chose est que ce n'est certainement pas "mauvais" pour Apple de décider cela, mais est-ce la manière élégante de faire les choses à tout le monde? Evidemment non. Et si vous n'êtes pas d'accord avec eux, ne vous inquiétez pas , il est tout à fait correct pour vous de réserver vos opinions sur certaines décisions d'Apple.

Quel est donc le but de ce changement? Peut-être qu'ils ont commencé une règle interne qui dit de ne jamais rendre les propriétés des composants UIKits non nulles par souci de cohérence. Peut-être pensent-ils qu'en théorie, il est possible que la propriété text soit libérée en raison de la pression de la mémoire dans certains cas extrêmes. Quoi qu'ils soient, je ne pense pas qu'ils soient valides, mais nous devons obéir. Mais cela ne fait pas de moi un fanboy.

4
superarts.org