Я пытаюсь предварительно заполнить таблицы паром 3 и свободным паром.Я новичок в Vapor
Я пытаюсь заполнить Sharedkeys
данными из Platform
.Мне удалось запросить Platform
.Тем не менее, я изо всех сил пытаюсь заполнить SharedKeys
Так что каждый platform
будет иметь shared key
Я привел пример ниже, с этим мне не повезло.
В этой строке let sharedKeys = platforms.map { platform in
Я получаю ошибку компиляции Unable to infer complex closure return type: add explicit type to disambiguate
Затем я понял, что map
возвращает [T]
, не могу найти способ создать Future<SharedKey>
вместо [SharedKey]
Вот пример моего кодирования, не стесняйтесь критиковать!
Модель платформы
struct Platform : Codable {
var id : Int?
/// Type of platform, i.e. iPhone, iPad, Android etc...
var platform : String
init(platform : String) {
self.platform = platform
}
}
extension Platform : PostgreSQLModel, Content {}
extension Platform : PostgreSQLMigration {
static func prepare(on conn: PostgreSQLConnection) -> Future<Void> {
return Database.create(self, on: conn) { builder in
try addProperties(to: builder)
builder.unique(on: \.platform)
}
}
}
SharedKey Модель
final class SharedKey: Codable {
var id : Int?
/// platform
var platID : Platform.ID?
/// shared key
var key : String
init(key: String, platform : Platform) {
self.key = key
self.platID = platform.id
}
}
extension SharedKey : PostgreSQLModel, Content {}
extension SharedKey : PostgreSQLMigration {
static func prepare(on conn: PostgreSQLConnection) -> Future<Void> {
return Database.create(self, on: conn) { builder in
try addProperties(to: builder)
builder.unique(on: \.key)
}
}
}
Попытка заполнения sharedKey
let p = Platform.query(on: conn).all()
let keysFuture = p.flatMap(to: [SharedKey].self) { platforms in
let sharedKeys = platforms.map { platform in
let key = SharedKey(key: "<random key>", platform: platform)
return key.save(on: conn)
}
return sharedKeys
}
Я ожидаю, что переменная keysFuture
будет иметь тип Future<[SharedKey]>
НЕ [SharedKey]
Редактировать:
Я использовал этот пример для предварительного заполнения Platform
: https://mihaelamj.github.io/Pre-populating%20a%20Database%20with%20Data%20in%20Vapor/
Заполнение строк в таблице легко, но попытка заполнить shared key
с помощью platform
является проблемой для меня.
Я понял, что мне нужно, чтобы Sharedkeys был [EventLoopFuture<Void>]
Я обновил следующее:
let pp = Platform.query(on: conn).all()
let op = pp.map { platforms in
return platforms.map { p in
return SharedKey(key: "random", platform: p).create(on: conn).map(to: Void.self) { _ in return }
}
}
Однако это возвращается как EventLoopFutrue<[EventLoopFutrue<Void>]>
Есть ли способ развернуть это?
Мне просто нужно добавить [EventLoopFutrue<Void>]
к futures
по ссылке выше (https://mihaelamj.github.io)