Swiftでデータベースを使おう！③（ランキングを作る・アクセス権限）

__【お知らせ】Swift3に対応しました！(2017/02/23更新)__

# 【Swift×mBaaS】シリーズ概要
* Swiftで[ニフティクラウドmobile backend](http://mb.cloud.nifty.com/)(通称：mBaaS)を使ってSwiftで開発を始めたい人向けのドキュメントです。
* [ニフティクラウドmobile backendのiOS(Objectiv-C SDK)用ドキュメント](http://mb.cloud.nifty.com/doc/current/index.html)を__Swift__用に書き換えて動かしてみたものをまとめました。
* 初心者でもわかりやすいよう心掛けて作っていますが、わかりにくい部分がありましたらコメントをいただければ訂正しますのでお気軽にご意見をお願いします^^*
* 今回は__＜データストア編③＞__として*ランキングを作る*・*アクセス権限設定*です！
 * 注：「データストア」が[ニフティクラウドmobile backend](http://mb.cloud.nifty.com/)の「データベース」のことです◎

# 事前準備のお願い
* 事前にニフティクラウド[mobile backendの登録](http://mb.cloud.nifty.com/)とアプリの新規作成をし、 [＜CocoaPods＞SwiftでmBaaSを始めよう！(use_framewoks!を有効にした方法)](http://qiita.com/natsumo/items/57d3a4d9be16b0490965)をご覧いただき、必要な初期設定(SDKのインストールなど)をXcode上で行った上でご利用ください。

# **Swiftでデータベースを使おう！**
* [ニフティクラウドmobile backend](http://mb.cloud.nifty.com/)のダッシュボードで確認をしながらXcodeで動作確認をしてください。
* ドキュメントの動作確認の方法については[Swiftでデータベースを使おう！①（保存・取得・更新・削除）](http://qiita.com/natsumo/items/c00cf7a48e0f8cd8d236)の「ドキュメントの動作確認方法」にまとめてありますので参考にしてみてください◎

## ランキングを作る
iOSアプリでランキングを実装する場合の使い方について解説します。
### *スコアの保存*
* 通常のオブジェクトの保存方法と同じようにプレイヤー名とスコアを設定してデータストアのHighScoreクラスに保存します。

```swift:Swift3
// HighScoreクラスのインスタンスを作成
let score = NCMBObject(className:"HighScore")
// 名前とスコアをセット
score?.setObject("name", forKey:"Name")
score?.setObject(0, forKey:"Score")
// データストアに保存
score?.saveInBackground({(error) in
    if error != nil {
        // 保存に失敗した場合の処理
    }else{
        // 保存に成功した場合の処理
    }
})
```

```swift:Swift2
// HighScoreクラスのインスタンスを作成
let score = NCMBObject(className:"HighScore")
// 名前とスコアをセット
score.setObject("name", forKey:"Name")
score.setObject(0, forKey:"Score")
// データストアに保存
score.saveInBackgroundWithBlock({(error: NSError!) in
    if error != nil {
        // 保存に失敗した場合の処理
    }else{
        // 保存に成功した場合の処理
    }
})
```

### *ランキングの取得*
* 各プレイヤーのスコアが保存されるHighScoreクラスから、スコアの降順データを検索することで、簡単にランキングを取得できます。

```swift:Swift3
// HighScoreクラスを検索するNCMBQueryを作成
let query = NCMBQuery(className:"HighScore")
// Scoreの降順でデータを取得するように設定
query?.addDescendingOrder("Score")
// 検索件数を5件に設定
query?.limit = 5
// データストアでの検索を行う
query?.findObjectsInBackground({(objects, error) in
    if error != nil {
        // 検索に失敗した場合の処理
    }else{
        // 検索に成功した場合の処理
        print(objects as! [NCMBObject]) // 例)取得結果を表示
    }
})
```

```swift:Swift2
// HighScoreクラスを検索するNCMBQueryを作成
let query = NCMBQuery(className:"HighScore")
// Scoreの降順でデータを取得するように設定
query.addDescendingOrder("Score")
// 検索件数を5件に設定
query.limit = 5
// データストアでの検索を行う
query.findObjectsInBackgroundWithBlock({(objects: [NSArray]!, error: NSError!) -> void in
    if error != nil {
        // 検索に失敗した場合の処理
    }else{
        // 検索に成功した場合の処理
        print(objects) // 例)取得結果を表示
    }
})
```
* ゲームのにオンラインランキングはこんなに簡単に実装できてしまうんですね！！^^*

## アクセス権限設定
データストアのACL機能を利用して各データのアクセス権限を会員、ロールごとに設定する方法を説明します。

* ACLを設定する場合は、NCMBACLクラスを利用します。

```swift:Swift3
//ACLオブジェクトを作成
let acl = NCMBACL()
//読み込み(検索)・書き込みを全開放を設定
acl.setPublicReadAccess(true)
acl.setPublicWriteAccess(true)

let obj = NCMBObject(className:"test")
//オブジェクトにACLを設定
obj?.acl = acl
obj?.save(nil)
```

```swift:Swift2
//ACLオブジェクトを作成
let acl = NCMBACL()
//読み込み(検索)・書き込みを全開放を設定
acl.setPublicReadAccess(true)
acl.setPublicWriteAccess(true)
        
let obj = NCMBObject(className:"test")
//オブジェクトにACLを設定
obj.ACL = acl
obj.save(nil)
```

* 会員やロールを対象にACLを設定することも可能です。このとき、会員やロールは登録が済んでおりobjectIdを持っている必要があります。
* 一部会員管理クラス(userクラス)の知識が必要です。
 * 会員管理のドキュメントには[＜会員管理編＞](http://qiita.com/natsumo/items/25c97182fab4db5629b1)をご覧ください。

```swift:Swift3
let sharedNote = NCMBObject(className:"Note")
sharedNote?.setObject("This note is shared!", forKey:"content")
// NCMBACLのインスタンスを作成
let groupACL = NCMBACL()
let user = NCMBUser()
user?.userName = "user"
user?.password = "password"
//上記ユーザー名とパスワードで新規登録ログインを実施
user?.signUp(nil)
// 引数で渡された会員userへの読み込み権限を設定する
groupACL.setReadAccess(true, for:user)
// 引数で渡された会員userへの書き込み権限を設定する
groupACL.setWriteAccess(true, for:user)
//ACLをオブジェクトに設定する
sharedNote?.acl = groupACL
sharedNote?.save(nil)
```

```swift:Swift2
let sharedNote = NCMBObject(className:"Note")
sharedNote.setObject("This note is shared!", forKey:"content")
// NCMBACLのインスタンスを作成
let groupACL = NCMBACL()
let user = NCMBUser()
user.userName = "user"
user.password = "password"
//上記ユーザー名とパスワードで新規登録ログインを実施
user.signUp(nil)
// 引数で渡された会員userへの読み込み権限を設定する
groupACL.setReadAccess(true, forUser:user)
// 引数で渡された会員userへの書き込み権限を設定する
groupACL.setWriteAccess(true, forUser:user)
//ACLをオブジェクトに設定する
sharedNote.ACL = groupACL
sharedNote.save(nil)
```

# 参考
* 元サイト
 * [ニフティクラウドmobile backendのiOS(Objectiv-C)用ドキュメント](http://mb.cloud.nifty.com/doc/current/index.html)