Protocol Buffers とは

Protocol buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data.

Protocol Buffers | Google Developers

インストール

  1. protobuf のインストール

    HomeBrew でインストールする。

    $ brew install protobuf
    
    $ which protoc
    /usr/local/bin/protoc
  2. Swift Protobuf のインストール

    Protocol Buffers を Swift で扱うためには Apple が提供している Swift Protobuf を使用する。
    このメモではタグ0.9.902を使用する。

    $ git clone https://github.com/apple/swift-protobuf.git
    $ git checkout tags/0.9.902
    $ cd swift-protobuf
    $ swift build
    $ cp .build/debug/protoc-gen-swift /usr/local/bin

    protoc と同じ場所にインストールしている。

使用手順

  1. Xcode プロジェクトに Swift Protobuf のライブラリをインストール

    • CocoaPods

      Podfile

      pod 'SwiftProtobuf', git: 'https://github.com/apple/swift-protobuf.git', :tag => '0.9.902'
    • Carthage

      Carfile

      github "apple/swift-protobuf" "0.9.902"

    タグのバージョンを合わせる必要がある

  2. proto ファイルの作成

    [名称] + .proto ファイルを作成する。
    このメモでは SampleModel.proto を作成する。

    syntax = "proto3";
    
    message BookInfo {
        int64 id = 1;
        string title = 2;
        string author = 3;
    }
  3. Swift コードの生成

    作成した proto ファイルから Swift コードを生成する。

    $ protoc --swift_out=. SampleModel.proto

    [名称] + .pb.swift が生成される。 このメモでは SampleModel.pb.swift が生成される。

  4. 生成された pb.swift ファイルを Xcode プロジェクトに追加

サンプルコード

とりあえずローカル動作のサンプルコード

var bookInfo: BookInfo = BookInfo()
bookInfo.id = 123
bookInfo.title = "abc"
bookInfo.author = "?"

do {
    // convert to JSON
    let json: String = try bookInfo.jsonString()
    print(json)

    // output
    // {"id":"123","title":"abc","author":"?"}

    // convert to Protocol Buffers
    let pb: Data = try bookInfo.serializedData()
    // convert from Protocol Buffers
    let bookInfoFromPb: BookInfo = try BookInfo(serializedData: pb)
    print(bookInfoFromPb.id, bookInfoFromPb.title, bookInfoFromPb.author)

    // output
    // 123 abc ?

    // convert from JSON
    let bookInfoFromJson: BookInfo = try BookInfo(jsonString: json)
    print(bookInfoFromJson.id, bookInfoFromJson.title, bookInfoFromJson.author)

    // output
    // 123 abc ?

} catch let error {
    print(error)
}

Next PostPrevious Post