8792


データベースに値を入れてそれを`TableView`に出力しようとしたのですが、`TableView`には何も表示されませんでした。なのでデータベースに入っている値を確認しようと以下のコードの`println("data:
\\(wordData)")`の行でログを出力しようとすると、「`unexpectedly found nil while unwrapping an
Optional
value`」というエラーが返ってきました。これは以下のコードでは配列の中身が`nil`になっているという認識でよろしいでしょうか？ということはデータベースに値が入っていないということでしょうか？しかしデータベースの中身を確認できるツールで確認したところ、確かに値は入っていました。  
どうすればデータベースの値を取ってくることができるでしょうか？どなたか分かる方に教えていただきたいです。すみませんが、よろしくお願いします。

[code]

        func outputWord(speech: String) -> Array<String> {
            var wordData: [String]! = []
            let wordArray = Word.objectsWhere("speech CONTAINS %@", speech)
    
            for item in wordArray {
                if let wordStore = item as? Word {
                    wordData.append(wordStore.speech)
    
                    println("data: \(wordData)")
                }
            }
    
            return wordData
        }
    
[/code]


CC BY-SA 3.0
2015-04-05T02:10:35.587
8772
2015-04-05T13:11:36.983
5210
question
swift realm optional
unexpectedly found nil while unwrapping an Optional value


> 以下のコードでは配列の中身がnilになっている

を確認するには、そこで`println()`するよりは、下の箇所で`println()`したほうがいいでしょう。

[code]

    func outputWord(speech: String) -> Array<String> {
        // var wordData: [String]! = [] 「!」はいりません。Optional型である必然性はないので。
        var wordData: [String] = []
        let wordArray = Word.objectsWhere("speech CONTAINS %@", speech)
        let result = (wordArray == nil) ? "nil" : "not nil" // 追加
        println("wordArray is " + result) // 追加
        /* 削除
        for item in wordArray {
            if let wordStore = item as? Word {
                wordData.append(wordStore.speech)
    
                println("data: \(wordData)")
            }
        }
        */
        return wordData
    }
    
[/code]

> 「let result =」 の行で「type does not conform to  
>  protocol NilliteralConvertible」というエラーが表示されました。

ということでしたら、それはクラス`Word`の構成と、クラスメソッド`objectsWhere()`の実装がどうなっているかの調査を抜きにして、問題解決に迫ることはできませんね。おそらくメソッド`objectsWhere()`が、非Optional型の返り値をとっているのに、nilを代入しているのだと推理できます。ならば、メソッド`objectsWhere()`の修正が必要です。  
あらたに質問を起こして、Realmに詳しい人限定でご質問なさることをお勧めします。


CC BY-SA 3.0
2015-04-05T02:59:42.043
8777
2015-04-05T03:32:19.353
2015-04-05T03:32:19.353
7362
7362
8772
answer


おそらく、Wordクラスのプロパティにdynamic修飾子が付いていないことが原因です。  
Wordクラスの定義が下記のご質問にて書かれているものと同じだとすると、

['RLMResults' is not convertible to
'RLMObject'](https://ja.stackoverflow.com/questions/8782/rlmresults-is-not-
convertible-to-rlmobject)

[code]

    class Word: RLMObject {
        var id = 0
        var speech = ""
        var word = ""
    
        override class func primaryKey() -> String {
            return "id"
        }
    }
    
[/code]

それを次のように、各プロパティにdynamic修飾子を付加するように書き換えます。

[code]

    class Word: RLMObject {
        dynamic var id = 0
        dynamic var speech = ""
        dynamic var word = ""
    
        override class func primaryKey() -> String {
            return "id"
        }
    }
    
[/code]

これで、`wordData.append(wordStore.speech)`の行で正しく値が取得できるようになると思いますので、`println`の行でクラッシュすることはなくなります。


CC BY-SA 3.0
2015-04-05T13:11:36.983
8792
2015-04-05T13:11:36.983
2017-04-13T12:52:38.920
-1
5519
8772
answer