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?
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).