Swift 如何向模型添加其他特性?

Swift 如何向模型添加其他特性?,swift,vapor,vapor-fluent,Swift,Vapor,Vapor Fluent,我有一个符合内容的模型: 导入蒸汽 导入流畅 最终类用户:模型、内容{ 静态let schema=“用户” @ID(键:.ID) 变量id:UUID? @字段(键:“电子邮件”) var电子邮件:String init(){} init(id:UUID?=nil,email:String){ self.id=id self.email=电子邮件 } } 这可以从数据库中获取,并直接从路由返回,因此客户端以JSON的形式接收用户 现在,我想向用户添加一个附加属性,该属性不存储在数据库中,而是一个

我有一个符合
内容的
模型

导入蒸汽
导入流畅
最终类用户:模型、内容{
静态let schema=“用户”
@ID(键:.ID)
变量id:UUID?
@字段(键:“电子邮件”)
var电子邮件:String
init(){}
init(id:UUID?=nil,email:String){
self.id=id
self.email=电子邮件
}
}
这可以从数据库中获取,并直接从路由返回,因此客户端以JSON的形式接收用户

现在,我想向用户添加一个附加属性,该属性不存储在数据库中,而是一个固定值,或者在从数据库加载用户后添加:

最终类用户:模型、内容{
// ...
var somether:String=“你好”
// ...
}

最终类用户:模型、内容{
// ...
var somether:字符串?//稍后设置
// ...
}

现在的问题是,这个属性从未添加到JSON中,因此客户端只获取用户的
id
email
,而不是
someProperty
。如何解决此问题?

当您希望从客户机发送或接收与模型具有不同表示形式的数据时,通常的做法是定义自定义类型,然后将其转换为模型类型或从模型类型转换为自定义类型

鉴于此,您将定义一个新的
User.Response
类型,该类型符合
Content
而不是
User
模型,并从您的路线返回该类型

extension User {
    struct Response: Content {
        let id: UUID
        let email: String
        let otherValue = "Hello World"
    }
}


func user(request: Request) throws -> EventLoopFuture<User.Response> {
    return User.find(UUID(), on: request.db).flatMapThrowing { user in
        guard let id = user.id else {
           throw Abort(.internalServerError, "User is missing ID")
        }

        return User.Response(id: id, email: user.email) 
    }
}
扩展用户{
结构响应:内容{
let id:UUID
让电子邮件:字符串
让otherValue=“你好,世界”
}
}
func用户(请求:request)抛出->EventLoopFuture{
返回User.find(UUID(),on:request.db).flatMapThrowing{User in
guard let id=user.id else{
抛出中止(.internalServerError,“用户缺少ID”)
}
返回User.Response(id:id,email:User.email)
}
}

您添加的附加值未从模型中编码的原因是,模型类型的默认编码器迭代字段属性并对这些属性进行编码,因此,如果您的属性未使用
ID
字段
父项
子项
,则,或其他字段属性包装器,则不会对其进行编码。

如果问题是“如何从Swift 4的可编码文件中排除属性?”那么答案是这里我的问题是,
someProperty
没有包含在结果中。我们可以看看编码发生的代码片段吗?可能设计流畅只编码@fieldproperties?我想编码是流畅的吗?OP,也许你应该有一个新的结构,其中也包含这个新字段,然后你在发送时映射到这个新结构?