17077


お世話になっております。  
以下で落ちる原因がわかりません。

[code]

    class MapsDocument: UIDocument {
    
        var documentText : NSString? {
    
            get {
                return self.documentText　// 【ここで落ちる】
            }
    
            set(newText) {
                let oldText = self.documentText
                self.documentText = newText!.copy() as? NSString
    
                // 取り消し操作を登録する
                self.undoManager.setActionName("Text Change")
                self.undoManager.registerUndoWithTarget(self, selector: "setDocumentText:", object: oldText)
            }
        }
    
[/code]

として、他のビューコントローラーで、

[code]

        var _document : MapsDocument!
    
            override func viewWillDisappear(animated: Bool) {
                super.viewWillDisappear(animated)
                let newText = self.textView.text
    
                if _document != nil {
    
                    _document.documentText = newText // 【ここで落ちる】
    
                    // ドキュメントを閉じる
                    _document.closeWithCompletionHandler(nil)
                }
            }
    
[/code]

として呼び出すと落ちます。

何がいけないのでしょうか？

`documentText`が`nil`なようなのですが。


CC BY-SA 3.0
2015-09-29T12:36:29.627
17065
2015-10-16T16:11:03.420
2015-10-16T16:11:03.420
5519
12297
question
swift
プロパティが初期化されない。


計算型プロパティ（ **Computed Property** ）の、 **get** 、 **set**
文の使い方を間違えています。`get`、`set`内で、プロパティ自身の値を参照するのは、コンパイルエラーにはなりませんが、論理矛盾なのはあきらかです。（Optional（`!`、`?`）の使い方も、ちょっとあやしい）  
こういうケースでは、Computed Propertyではなく、プロパティオブザーバ（ **Property Observer**
）を使うのが、妥当だと思います。

[code]

    var documentText: String = "" {
        // 初期値を与えておけば、オプショナルにしなくてすむ。
        didSet {
            // 取り消し操作を登録する
            self.undoManager.setActionName("Text Change")
            self.undoManager.registerUndoWithTarget(self, selector: "setDocumentText:", object: (oldValue as NSString))
            // didSet内では、変更前の値をoldValueで取得できる。
        }
    }
    
[/code]

※`String`型と`NSString`型は、`as`でキャスト可能。  
（Undo Managerの使い方は、検証に時間がかかるので、正しいか確認していません）


CC BY-SA 3.0
2015-09-29T21:39:37.593
17077
2015-09-30T08:42:03.463
2015-09-30T08:42:03.463
7362
7362
17065
answer