2017-06-12 10 views
1

私はVapor 2.0サーバー側のSwiftフレームワークに精通しています。文字列リテラルの広範な使用が私を混乱させます。あなたは文字列として2倍のデータベース名を使用するすべてのプロパティのために、見ることができるように蒸気のデータベース列名

// Initializes the Post from the database row 
init(row: Row) throws { 
    content = try row.get("content") 
} 

// Serializes the Post to the database 
func makeRow() throws -> Row { 
    var row = Row() 
    try row.set("content", content) 
    return row 
} 

:たとえば、あなたは(自動生成された例のプロジェクトから取られた)このような行を解析し、シリアライズする必要がModelプロトコルを実装この特定のプロトコルのためのリテラル。 Databaseプロトコル、独自のメソッドなどもっと多くのものがあります。

ここでパラメータとしてリテラル文字列を使用すると、スタティックアナライザがObjective-Cのキー値パラメータと同じようにチェックしないという明らかな欠点があります。このアプローチは非常にエラーを起こしやすくなります。私が行方不明のベストプラクティスはありますか?

答えて

1

文字列を繰り返す回数を、モデルに静的プロパティとして格納し、その代わりに参照することで、文字列を繰り返す回数を簡単に最小限に抑えることができます。

final class Post: Model { 
    // Keys 
    static let contentKey = "content" 

    // Properties 
    var content: String 

    // Initializes the Post from the database row 
    init(row: Row) throws { 
     content = try row.get(Post.contentKey) 
    } 

    // Serializes the Post to the database 
    func makeRow() throws -> Row { 
     var row = Row() 
     try row.set(Post.contentKey, content) 
     return row 
    } 

    ... 
} 

extension Post: Preparation { 
    static func prepare(_ database: Database) throws { 
     try database.create(self) { builder in 
      builder.id() 
      builder.string(Post.contentKey) 
     } 
    } 

    ... 
} 

残念ながら、これは多分、タイプセーフなものにするために意味のあることです。現在、データベースの実際の構造(またはJSONのような他の文字列型のもの)についてコンパイラに情報を与える方法はありません。しかし、それをやることができれば、本当に素晴らしいだろう!多分いつか。

(私はここでの問題を追跡し、これを含めるようにAPIとWebテンプレートの更新に見てみましょう:https://github.com/vapor/api-template/issues/35)を

+0

APIテンプレートがこのように動作するように更新されました。 :) https://github.com/vapor/api-template/pull/36 – tanner0101

0

あなたはそれを正しくやっている。 Swiftの高度なランタイムライブラリがないため、これを軽減する方法はほとんどありません。

ただし、Swift 4では、同じ目的でキーパスを使用できます。

\Post.contentは、コンテンツ変数の静的にチェックされたキーパスを作成します。

キーパス上のWWDCセッションは間違いなく価値があります。

+0

アドバイスしてくれてありがとう、って確かにセッションを見て! –