2017-07-28 8 views
-2

私はちょうどコーディングを始めました。私は、アプリが終了しても2つの変数を格納できるようにする必要があるSwiftでiOSアプリケーションを作っています。このために、私はレルムを使用しています。私はこれらの2つの変数を書くことができますが、それらを読み込もうとするとプロジェクトを構築できません。iOSプロジェクトでRealm変数の値を読み取るにはどうすればよいですか?

私は多くのtutoratsを試してみましたが、私は私の問題に適用しようとしたたびに、失敗しています。ここで

は私のレルムクラスです:

class Info: Object { 
    dynamic var name = "" 
    dynamic var gender = "" 
} 

は、どのように私は私のViewControllerでこれら二つの変数の値を読み取ることができますか?

私は、変数を読み込むしようとすると、私は私のViewControllerのライン

guard let info = realm.objects(Info.self).first else {return} 

上のエラーを持っている:

import UIKit 
import RealmSwift 

class SettingsViewController: UIViewController { 

    let realm = try! Realm() 
    guard let info = realm.objects(Info.self).first else {return} 
    let name = info.name 
    let gender = info.gender 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 
+0

「私は自分のプロジェクトをビルドすることはできません。」何故なの?そして、そこにいるのは< and >なのですか? (私はこれを見たことがありません!) –

+0

私はあなたが '' ''の代わりにいくつかの秘密の文字を使用しようとしているという野生の推測をしています。 – EpicPandaForce

+0

申し訳ありませんが«»、私のコンピュータのオートコレクトはそれを行いました。私は自分の投稿を修正する。 –

答えて

1

あなたはこのようなRealm変数にアクセスすることができます。

let realm = try! Realm() 
guard let info = realm.objects(Info.self).first else {return} 
let name = info.name 
let gender = info.gender 

しかし、より複雑なデータをストレージに保存する予定がない場合は、y単にUserDefaultsを使用してください。このような簡単な作業のために、使いやすくなっています。

文字列リテラルを格納する場合は、« »も適切な"記号に変更する必要があります。

あなたの質問の編集部分について: guard let info = realm.objects(Info.self).first else {return}は、viewDidLoadの機能内で発生する必要があります。クラスが実際に初期化される前にクラスのインスタンスプロパティであるrealmにアクセスすることはできません。したがって、エラーが発生します。情報をインスタンスプロパティにする必要がある場合は、オプションとして初期化し、viewDidLoadの内部にアクセスします。

最初のオプション - あなただけviewDidLoadinfoにアクセスする必要がある場合: - :これはあなたの場合は

class SettingsViewController: UIViewController { 

    let realm = try! Realm() 
    var info: Info?  

    override func viewDidLoad() { 
     super.viewDidLoad() 
     info = realm.objects(Info.self).first else {return} 
     let name = info.name 
     let gender = info.gender 
    } 

} 

あなたのクラスのインスタンスでどこでもinfoにアクセスする必要がある場合は、2番目のオプション

class SettingsViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let realm = try! Realm() 
     guard let info = realm.objects(Info.self).first else {return} 
     let name = info.name 
     let gender = info.gender 
    } 

} 

インスタンスのプロパティとしてレルムを宣言すると、問題が発生する可能性があります。application(didFinishLaunchingWithOptions)関数の実行が完了する前にクラスがインスタンス化されている可能性があります。 realm schemaは、SettingsViewControllerでアクセスしようとすると、正しく設定されません。この場合は、let realm = try! Realm()viewDidLoadに移動してください。

+0

私のプロジェクトをビルドしようとすると、エラーメッセージで失敗しました:«プロパティ初期化子内でインスタンスメンバー 'realm'を使用できません。 'self'が利用可能になる前に実行されるプロパティ初期化子。私は何をすべきか? –

+0

実際にエラーを起こしたコードを含めてください。 –

+0

私は私の質問にラインを追加しました。 –

関連する問題