本に書いてあった下記のコードを実行するとRealmのRLMConstants.hというファイルに「'swift_name' attribute cannot be applied to this declaration」というエラーが出ます。ネットで探してもそれらしいのは見つかりません。解決方法を御教示いただけますでしょうか。
参考にしている本は、「ほんきで学ぶSwift+iOSアプリ開発入門(ISBN-10:4798142352)」です。Realmは最新版です。xcodeは7.1です。
① ViewController.swiftのコード
import UIKit
import RealmSwift
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
// デフォルトの Realm インスタンスを取得する
let realm = try! Realm()
// DB 内の日記データが格納されるリスト(日付新しいもの順でソート:降順)。以降内容をアップデートするとリスト内は自動的に更新される。
let dataArray = try! Realm().objects(Diary).sorted("date", ascending: false)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// 入力画面から戻ってきた時に TableView を更新させる
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
// segue で画面遷移するに呼ばれる
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
let inputViewController:InputViewController = segue.destinationViewController as! InputViewController
if segue.identifier == "cellSegue" {
let indexPath = self.tableView.indexPathForSelectedRow
inputViewController.diary = dataArray[indexPath!.row]
} else {
let diary = Diary()
diary.title = "タイトル"
diary.body = "本文"
if dataArray.count != 0 {
diary.id = dataArray.max("id")! + 1
}
inputViewController.diary = diary
}
}
// MARK: UITableViewDataSource プロトコルのメソッド
// TableView の各セクションのセルの数を返す
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataArray.count
}
// 各セルの内容を返す
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// 再利用可能な cell を得る
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
// Cellに値を設定する.
let object = dataArray[indexPath.row]
cell.textLabel?.text = object.title
cell.detailTextLabel?.text = object.date.description
return cell
}
// MARK: UITableViewDataSource プロトコルのメソッド
// Delete ボタンが押された時の処理を行う
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == UITableViewCellEditingStyle.Delete {
try! realm.write {
self.realm.delete(self.dataArray[indexPath.row])
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)
}
}
}
// セルが削除が可能なことを伝える
func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath)-> UITableViewCellEditingStyle {
return UITableViewCellEditingStyle.Delete;
}
// 各セルを選択した時に実行される
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
performSegueWithIdentifier("cellSegue",sender: nil)
}
}
②InputViewController.swiftのコード
import UIKit
import RealmSwift
class InputViewController: UIViewController {
@IBOutlet weak var titleTextField: UITextField!
@IBOutlet weak var bodyTextView: UITextView!
let realm = try! Realm()
var diary: Diary!
override func viewDidLoad() {
super.viewDidLoad()
// NavigationBar の戻るボタンを消す
self.navigationItem.setHidesBackButton(true, animated:false);
titleTextField.text = diary.title
bodyTextView.text = diary.body
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func save(sender: UIButton) {
try! realm.write {
self.diary.title = self.titleTextField.text!
self.diary.body = self.bodyTextView.text
self.diary.date = NSDate()
self.realm.add(self.diary, update: true)
}
self.navigationController?.popViewControllerAnimated(true)
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
③Diary.swiftのコード
import RealmSwift
class Diary: Object {
dynamic var id = 0
// タイトル
dynamic var title = ""
// 本文
dynamic var body = ""
/// 最終更新日時
dynamic var date = NSDate()
/**
id をプライマリーキーとして設定
*/
override static func primaryKey() -> String? {
return "id"
}
}