我正在使用Swift和Vapor(服务器端)创建一个基本的CRUD。
在我的控制器中,我创建了一个新方法:“编辑”。在此方法中,可以更新用户的密码和角色。 IF 请求有密码数据,请更新密码。 IF 请求有一个新的角色数组,更新角色(兄弟关系尚未完成)。
这是我的控制器中的“编辑”方法:
func edit(request:Request, id:String) throws -> ResponseRepresentable {
// Check if the password came in POST request:
let password = request.data["password"]?.string
// Check if the request has a new set of roles
let roles = request.data["roles"]?.array
let user:ClinicUser = try ClinicUser.edit(id: id, password: password, roles: roles)
return user
}
在我的模型中,编辑方法如下所示:
static func edit(id:String, password:String?, roles:Array<NodeRepresentable>?) throws -> ClinicUser {
guard var user:ClinicUser = try ClinicUser.find(id) else {
throw Abort.notFound
}
// Is it the best way of doing this? Because with "guard" I should "return" or "throw", right?
if password != nil {
user.password = try BCrypt.hash(password: password!)
}
// TODO: update user's roles relationships
try user.save()
return user
}
在我的控制器中,XCode指出的错误是Cannot convert value of type '[Polymorphic]?' to expected argument type 'Array<NodeRepresentable>'
。并且,作为修复,Xcode建议这样写:
let user:ClinicUser = try ClinicUser.edit(id: id, password: password, roles: roles as! Array<NodeRepresentable>)
我不确定这是否安全,或者这是否是最佳做法(强制用打开)。
我不知道在Swift中我是否应该“思考”与其他语言(如PHP等)不同。最后,我想要的是:
static func edit(id:String, fieldA:String?, fieldN:String, etc..) throws -> ClinicUser {
// If fieldA is available, update fieldA:
if fieldA != nil {
model.fieldA = fieldA
}
// If fieldN is available, update fieldN:
if fieldN != nil {
model.fieldN = fieldN
}
// After update all fields, save:
try model.save()
// Return the updated model:
return model
}
答案 0 :(得分:0)
在您的控制器中,您可以执行以下操作:
// Check if the request has a new set of roles
let rolesArray = request.data["roles"]?.array
guard let roles = rolesArray as? Array<NodeRepresentable>
else {
// throw "SomeError" or return "Some other response"
}
Xcode抱怨,因为它无法在编译时指定您从请求数据中获取的数组类型。
因此,您必须将其转发为更具体的类型。
您有两种选择。
所以,如果你使用?并且保护,如果失败,你可以中断你的功能执行并决定你想做什么。