web-dev-qa-db-fra.com

Swift: Que signifie la barre oblique inverse "\". signifier?

Je suis nouveau dans le backend Swift et j'ai pensé utiliser Vapor pour démarrer rapidement un projet parallèle ... J'ai exécuté vapor new WebServer --template=auth-template, et maintenant j'essaie de comprendre ce que quelque chose comme return \.email veux dire. Pour plus de contexte, je regarde dans WebServer> Sources> App> Modèles> Users.Swift:

import Authentication
import FluentSQLite
import Vapor

/// Allows users to be verified by basic / password auth middleware.
extension User: PasswordAuthenticatable {
    /// See `PasswordAuthenticatable`.
    static var usernameKey: WritableKeyPath<User, String> {
        return \.email
    }

// ...
}

Et voici la définition de la classe User:

/// A registered user, capable of owning todo items.
final class User: SQLiteModel {
    // {omit extra code} ...

    var email: String

    // {omit extra code} ...

    /// Creates a new `User`.
    init(id: Int? = nil, name: String, email: String, passwordHash: String) {
        // {omit extra code} ...
        self.email = email
        // {omit extra code} ...
    }
}

Que signifie cette notation de point barre oblique inverse?

16
user3773048

tl; dr: Nous jetons un œil à la référence de langage Swift, et bien sûr, l'utilisation de cette barre oblique inverse) La notation -dot est appelée expression-chemin-clé .

(La question a reçu une réponse suffisante à ce stade.)

Une approche plus pratique sur la façon d'accéder à ce document enfoui:

Comme vous pouvez le voir dans le code que vous avez publié, la classe User contient un propriété nommé email.

Notez que, si vous utilisez Xcode, si vous remplacez return \.email avec return \, vous obtenez l'erreur de compilation "Expected expression path in Swift key path", c'est donc un indice que cette notation de barre oblique inverse pourrait avoir à voir avec quelque chose appelé un chemin de clé.

À partir de cette documentation sur le chemin d'accès, nous voyons que nous aurions également pu écrire \User.email (et vous pouvez l'essayer dans Xcode sans erreur de compilation).

Comprendre le contexte plus large de ce qui se passe dans ce code:

Donc, sémantiquement, pour comprendre la signification de la déclaration usernameKey que vous regardez, nous pourrions vouloir comprendre ce qu'est un WritableKeyPath. En simple, à partir de la documentation, nous voyons qu'un WritableKeyPath est: "Un chemin de clé qui prend en charge la lecture et l'écriture de la valeur résultante."

Ainsi, nous voyons que la déclaration usernameKey prend un objet WritableKeyPath et retourne un String qui est User.email.

De plus, il est évident que la classe User a besoin de cette propriété usernameKey pour se conformer au protocole PasswordAuthenticatable, qui a été importé sur la première ligne avec import Authentication (si vous souhaitez y explorer, jetez un œil à Dépendances> Auth 2.0.0> Authentification> Basique> BasicAuthenticatable.Swift).

19
user3773048