我是后端Swift的新手,并且以为我会使用Vapor来快速启动和运行一个副项目...
我运行了vapor new WebServer --template=auth-template
,现在我正在尝试弄清return \.email
的含义。
有关更多上下文,我在WebServer>源> App>模型> 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} ...
}
}
这种反斜杠符号是什么意思?
答案 0 :(得分:8)
tl; dr::我们看一下Swift语言参考,可以肯定的是,这种反斜杠点表示法的使用称为key-path-expression。
(到目前为止,问题已得到充分回答。)
有关如何获取该隐藏文档的更多动手方法:
从发布的代码中可以看到,User类包含一个名为email
的{{3}}。
请注意,假设您使用的是Xcode,如果将return \.email
替换为return \
,则会出现编译错误"Expected expression path in Swift key path"
,因此这表明该反斜杠点符号可能与称为关键路径的东西有关。
从关于键路径的文档中,我们看到我们也可以编写\User.email
(并且您可以在Xcode中尝试它,而没有编译器错误)。
了解该代码中发生的事情的更大上下文:
因此,从语义上讲,要了解您正在查看的usernameKey
声明的含义,我们可能想了解WritableKeyPath
是什么。简单来说,从文档中我们可以看到WritableKeyPath
是:“支持读取和写入结果值的键路径。”
因此,我们看到usernameKey
声明接受一个WritableKeyPath
对象,并返回一个String
的{{1}}。
此外,很明显,User类需要此User.email
属性才能符合usernameKey
协议,该协议在PasswordAuthenticatable
的第一行中导入(如果您愿意在那里探索,请查看“依赖关系”>“身份验证2.0.0”>“身份验证”>“基本”>“ BasicAuthenticatable.swift”。