web-dev-qa-db-ja.com

Swift:バックスラッシュドット「\」とは何ですか。平均?

私はバックエンドの初心者Swiftであり、Vaporを使用してサイドプロジェクトをすばやく実行できると思っていました... vapor new WebServer --template=auth-templateを実行しました。 m 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} ...
    }
}

このバックスラッシュドット表記はどういう意味ですか?

16
user3773048

tl; dr:Swift言語リファレンスを確認します。そして、このバックスラッシュの使用法-ドット表記は key-path-expression と呼ばれます。

(この時点で、質問は十分に回答されています。)

その埋められたドキュメントの一部に到達する方法に関するより実践的なアプローチ:

投稿したコードからわかるように、Userクラスにはemailという名前の property が含まれています。

Xcodeを使用していると仮定して、return \.emailreturn \で置き換えると、コンパイルエラー"Expected expression path in Swift key path"が発生することに注意してください。これは、このバックスラッシュドット表記が持つかもしれないヒントです。キーパスと呼ばれるものを使用します。

Key-pathに関するドキュメントから、\User.emailも記述できたことがわかります(コンパイラエラーなしでXcodeで試すことができます)。

そのコードで何が起こっているかについてのより大きなコンテキストを理解する:

したがって、意味的には、あなたが見ているusernameKey宣言の意味を理解するために、WritableKeyPathが何であるかを理解したいと思うかもしれません。簡単に言えば、ドキュメントから、WritableKeyPathが「結果の値の読み取りと書き込みをサポートするキーパス」であることがわかります。

したがって、usernameKey宣言がWritableKeyPathオブジェクトを取り込んで、StringUser.emailであることがわかります。

さらに、import Authenticationを使用して最初の行にインポートされたusernameKeyプロトコルに準拠するために、UserクラスがこのPasswordAuthenticatableプロパティを必要とすることは明らかです(探索する場合)そこで、[依存関係]> [Auth 2.0.0]> [認証]> [基本]> [BasicAuthenticatable.Swift]を確認します。

19
user3773048