【问题标题】:Swift: What does backslash dot "\." mean?斯威夫特:反斜杠点“\”是什么意思?意思是?
【发布时间】:2022-01-17 17:40:22
【问题描述】:

我是后端 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} ...
    }
}

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

【问题讨论】:

    标签: swift authentication vapor


    【解决方案1】:

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

    (到此为止,这个问题已经得到了充分的回答。)

    关于如何获取隐藏文档的更实用方法:

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

    请注意,假设您使用的是 Xcode,如果您将 return \.email 替换为 return \,您会收到编译错误 "Expected expression path in Swift key path",因此这暗示了此反斜杠点符号可能与称为关键路径的东西。

    从关于 key-path 的文档中,我们看到我们也可以编写 \User.email(您可以在 Xcode 中尝试它而不会出现编译器错误)。

    了解代码中发生的事情的更大背景:

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

    所以,我们看到usernameKey 声明接受WritableKeyPath 对象并返回String,即User.email

    此外,很明显 User 类需要这个 usernameKey 属性以符合 PasswordAuthenticatable 协议,该协议是在第一行以 import Authentication 导入的(如果你想在那里探索,看看在 Dependencies > Auth 2.0.0 > Authentication > Basic > BasicAuthenticatable.swift)。

    【讨论】:

    • 具体来说,使用\.property 只是\Type.property 的简写。 Swift 通常可以推断出您正在使用的根类型,但有时您必须输入整个键路径。
    • @AndreasZUERCHER 接受您自己的答案并不会提高您的声誉等级。如果您回答自己的问题,则只有在其他人支持的情况下,您才能从该答案中获益。
    • ^ 是的,自我回答。当时我也很想知道这一点,而且我在网上找不到太多东西,所以我决定发布一个问答,以便那些更喜欢 StackOverflow 答案的人可以轻松找到。 @AndreasZUERCHER 随意回答更好的答案;对于那些对此问题感兴趣的人来说,这可能是一个有用的替代视角。
    • 是的,我会的。我正在考虑我还能添加什么。 @ user3773048,您的回答非常好。我会和你一起找出一条平行的飞行路线,这样它们就可以互补了。
    猜你喜欢
    • 1970-01-01
    • 2018-08-03
    • 2021-06-15
    • 1970-01-01
    • 2015-11-19
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多