首页 > 解决方案 > 斯威夫特:反斜杠点“\”是什么意思?意思是?

问题描述

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

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

标签: swiftauthenticationvapor

解决方案


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

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

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

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

请注意,假设您使用的是 Xcode,如果您替换return \.emailreturn \,您会得到 compile-error "Expected expression path in Swift key path",因此这暗示了这种反斜杠点符号可能与称为键路径的东西有关。

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

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

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

因此,我们看到usernameKey声明接受了一个WritableKeyPath对象并返回一个Stringthat is User.email

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


推荐阅读