Swift:反斜杠点是什么"\".意思?

use*_*048 11 authentication swift vapor

我是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
    }

// ...
}
Run Code Online (Sandbox Code Playgroud)

这是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} ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这种反斜杠点符号是什么意思?

use*_*048 15

tl; dr:我们看一下Swift语言参考,果然,这种反斜杠点表示法的用法称为key-path-expression.

(到目前为止,这个问题得到了充分的回答.)

如何获取这些隐藏文档的更实际的方法:

从您发布的代码中可以看出,User类包含一个名为的属性email.

请注意,假设您正在使用Xcode,如果替换return \.emailreturn \,则会出现编译错误"Expected expression path in Swift key path",因此这提示此反斜杠点符号可能与称为键路径的内容有关.

从关键路径上的文档中,我们看到我们也可以编写\User.email(并且您可以在Xcode中尝试它而不会出现编译器错误).

了解该代码中正在发生的事件的更大背景:

因此,从语义上讲,要了解usernameKey您正在查看的声明的含义,我们可能想要了解它WritableKeyPath是什么.简单来说,从文档中我们看到a WritableKeyPath是:"支持读取和写入结果值的关键路径."

所以,我们看到,该usernameKey声明发生在一个WritableKeyPath对象,并返回一个String就是User.email.

此外,显然User类需要此usernameKey属性才能符合PasswordAuthenticatable在第一行导入的协议import Authentication(如果您需要在那里进行探索,请查看依赖项> Auth 2.0.0>身份验证>基本> BasicAuthenticatable.swift).

  • 具体来说,使用\ .property是\ Type.property的简写。Swift通常可以推断出您正在使用的根类型,但是有时您必须键入整个键路径。 (2认同)
  • @AndreasZUERCHER 接受你自己的答案并不会提高你的声誉水平。如果您回答自己的问题,只有其他人赞同您的答案,您才能从该答案中获益。 (2认同)
  • @AndreasZUERCHER https://stackoverflow.com/help/self-answer (2认同)
  • ^ 是的,自我回答。当时我也很想知道这个问题,但我在网上找不到太多信息,所以我决定发布一个 QA,以便那些喜欢使用 StackOverflow 答案的人可以轻松找到它。@AndreasZUERCHER 请随意回答更好的答案;对于那些对这个问题感兴趣的人来说,这可能是一个有用的替代视角。 (2认同)