Swift: Что означает точка с обратной косой чертой "\."имею в виду? - PullRequest
0 голосов
/ 27 сентября 2018

Я новичок в бэкэнде Swift и думал, что буду использовать Vapor для быстрого запуска побочного проекта ... Я запустил vapor new WebServer --template=auth-template, и теперь я пытаюсь выяснить, что-то вродеreturn \.email означает.Для большего контекста я ищу в WebServer> Sources> App> Models> 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
    }

// ...
}

А вот определение класса 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} ...
    }
}

Чтоозначает это обозначение с обратной косой чертой?

1 Ответ

0 голосов
/ 27 сентября 2018

tl; dr: Мы рассмотрим справочник по языку Swift, и, конечно же, использование этой нотации с обратной косой чертой называется key-path-expression .

(К этому моменту на вопрос уже был дан достаточный ответ.)

Более практический подход к тому, как добраться до этой части скрытой документации:

Как видно из опубликованного кода, класс User содержит свойство с именем email.

Обратите внимание, что, если вы используете XCode, если вы замените return \.email на return \, вы получите ошибку компиляции "Expected expression path in Swift key path", так что это подсказка, которая может иметь эта нотация с обратной косой чертойделать с чем-то, называемым ключевым путем.

Из этой документации по ключевому пути мы видим, что мы могли бы также написать \User.email (и вы можете попробовать это в Xcode без ошибок компилятора).

Пониманиеболее широкий контекст того, что происходит в этом коде:

Итак, семантически, чтобы понять смысл просматриваемой декларации usernameKey, мы могли бы захотеть понять, что такое WritableKeyPathявляется.Проще говоря, из документации мы видим, что WritableKeyPath это: «Ключевой путь, который поддерживает чтение и запись в результирующее значение.»

Итак, мы видим, что объявление usernameKey принимаетобъект WritableKeyPath и возвращает String, то есть User.email.

Кроме того, очевидно, что классу User необходимо это свойство usernameKey, чтобы соответствовать протоколу PasswordAuthenticatable, который былимпортируется в первой строке с import Authentication (если вы хотите изучить его, посмотрите на Зависимости> Auth 2.0.0> Аутентификация> Basic> BasicAuthenticatable.swift).

...