簡體   English   中英

蒸氣/流利-在模型中使用協議類型

[英]Vapor / Fluent - Using Protocol Type in a model

我正在嘗試使用Vapor和Fluent的服務器端Swift項目。 該項目的目的是跟蹤運動員及其訓練計划和鍛煉。 嘗試面向協議,我有一個名為“ Workout”的協議,然后有各種符合“ Workout”的類,例如“ run”,“ swim”等。

Workout.swift:

import Vapor
import FluentPostgreSQL

protocol Workout {
    var title: String { get set }
    var duration: Int { get set }
}

然后,例如,Run.swift:

import Vapor
import FluentPostgreSQL

final class Run: Workout, Codable {
    //Conform to Workout
    var title: String
    var duration: Int

    //New Properties
    var distance: Double
    var id: Int?

    init(title: String, duration: Int, distance: Double) {
        self.title = title
        self.duration = duration
        self.distance = distance
    }
}

extension Run: PostgreSQLModel {}
extension Run: Content {}

當我為“培訓計划”創建模型時,我想使用以下參數:

var workouts = [Workout]?

允許任何符合Workout的類型。

TrainingPlan.swift:

import Vapor
import FluentPostgreSQL

final class TrainingPlan: Codable {
    var id: Int?
    var title: String
    var workouts: [Workout]?

    init(title: String) {
        self.title = title
    }
}

extension TrainingPlan: PostgreSQLModel {}
extension TrainingPlan: Content {}

我在TrainingPlan.swift上收到以下錯誤:

類型“ TrainingPlan”不符合協議“可分解”

類型“ TrainingPlan”不符合協議“可編碼”

將Workout.swift更改為:

protocol Workout: Codable {
    var title: String { get set }
    var duration: Int { get set }
}

無法解決錯誤。

在我的數據建模中仍然保持面向協議的情況下,用Fluent處理此問題的正確方法是什么? 謝謝!

更新(6/20/18):

在TrainingPlan.swift中設置通用類型(針對符合Workout的類型)可解決有關符合可編碼/可解碼的錯誤:

import Vapor
import FluentPostgreSQL

final class TrainingPlan<W: Workout>: Codable {
    var id: Int?
    var title: String
    var workouts: [W]?

    init(title: String) {
        self.title = title
    }
}

extension TrainingPlan: PostgreSQLModel {}
extension TrainingPlan: Content {}
extension TrainingPlan: Parameter {}
extension TrainingPlan: Migration {}

但是,此實現會在將TrainingPlan添加到configure.swift中的數據庫遷移中時引起另一個錯誤:

migrations.add(model: TrainingPlan.self, database: .psql)

產生錯誤:

無法推斷通用參數“ W”

你需要做

swift migrations.add(model: TrainingPlan<ConcreteWorkoutType>.self, database: .psql)

因此,編譯器在編譯代碼時就知道泛型是什么

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM