2016-07-04 3 views
1

基本的に私は簡単なノートアプリケーションを作ろうとしています。ここではタイトルとコンテンツを表示しようとしています。この文字列の値がnilになるのはなぜですか?

プロジェクト(注)Iは、プロジェクトのいずれかを参照する場合

import Foundation 

class Project 
{ 
    var title = " " 
    var content = " " 
    var after = " " 
} 

注詳細ビュー・コントローラ・ファイル

class NoteDetailViewController: UIViewController 
{ 
    var project: Project! 

    @IBOutlet weak var titleTextField: UITextField! 
    @IBOutlet weak var contentTextField: UITextView! 
    @IBOutlet weak var afterTextField: UITextView! 

    override func viewWillAppear(animated: Bool) 
    { 
     super.viewWillAppear(animated) 
     titleTextField.text = project.title 
     contentTextField.text = project.content 
     afterTextField.text = project.after 

     contentTextField.sizeToFit() 
     afterTextField.sizeToFit() 
    } 

    override func viewWillDisappear(animated: Bool) 
    { 
     super.viewWillDisappear(animated) 

     project.title = titleTextField.text! 
     project.content = contentTextField.text! 
    } 

} 

ファイル。ファイル、私はゼロを得る。私はなぜ文字列から何も得られないのか分かりません。

+0

どの行からnilが得られますか? – jestro

答えて

3

存在しないため、

project = new Project() 

ので、そのプロパティにアクセスすると、最終的にはnilを返します。

let project = Project() 
2

projectは初期化されていません。オブジェクトが正しくクラス「プロジェクト」を初期化する必要があり

1

はい、プロパティを初期化することは間違いなく、問題を修正したがスローされるエラーの背後にある理由があります、というだけで、エラーが離れて行くようにプロパティを初期化するよりも理解価値がその1。

あなたのようにあなたの財産を宣言した場合:あなたはすぐには(Implicit Unwrappingをアンラップ取得オプションプロパティを宣言している

var project: Project! //- with a ! 

、これはコンパイラは、プロパティケースを処理するために期待していることを意味しnilであり、プロパティを使用するときにコンパイルエラーがスローされることはありません(既にアンラップされているため)。 Swiftは実行時ではなくコンパイル時に多くのエラーをキャッチしようとしており、宣言時にオプションをアンラッピングすることによって、すべての良さに欠けているように設計されています。あなたの毎日の迅速で

あなたはとてもとしてオプションのプロパティを宣言します:あなたはそれをアンラップすることなく、プロパティの値にアクセスしようとすると、コンパイル時エラーをスローしていました

var project: Project? 

を。たとえば、実行するとき:(それが適用される場合)あなたはオプションであるためにあなたの財産を必要としない場合、あなたはそれを宣言するときに変数を初期化したり、クラスのコンストラクタでそう

var project: Project? 

override func viewWillAppear(animated: Bool) 
{ 
    super.viewWillAppear(animated) 
    titleTextField.text = project.title //- The compiler will scream at you here. 
    contentTextField.text = project.content 
    afterTextField.text = project.after 

    contentTextField.sizeToFit() 
    afterTextField.sizeToFit() 
} 

をし、避けてください。暗黙のうちにオプションをアンラップすると、実行時エラーが発生する可能性があります。

希望すると便利です。

関連する問題