

パスの設定時に以下のコード中のコメントで示したようなエラーが出てしまいます。原因がわからないため、もしわかる方がいましたら、ご教授お願いします。

[code]

    import UIKit
    
    class ViewController: UIViewController {
    
        let paths = NSSearchPathForDirectoriesInDomains(
            .DocumentDirectory,
            .UserDomainMask, true)
    
        let documentsPath = paths[0]
    　　 // Instance member 'paths' cannot be used in type 'ViewController
    　　 // というエラーが出てしまいます。
    
        let path = (paths[0] as NSString).stringByAppendingPathComponent("datastore.plist")
        print(paths)
    
        var user:NSDictionary = [
            "Name": "A",
            "Age": "B",
            "Sex": "C",
        ]
    
        let success = user.writeToFile(path, atomically: true)
        // Instance member 'user' cannot be used in type 'ViewController
        // というエラーが出てしまいます。
    
        //print(success)
        if success {
        print("success!")
        } else {
        print("failure!")
        }
    
        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.
        }
    
    }
    
[/code]


CC BY-SA 3.0
2015-11-19T08:02:17.013
19033
2015-11-19T19:21:29.220
2015-11-19T08:21:51.767
7290
12536
question
swift xcode
パスの設定時のエラー


詳しい説明は、後からします。とりあえず、下のプログラムをコピー＆ペースとして、ビルドしてみてください。そして、シミュレータ上で、ボタン「Save」を押し、次にボタン「Read」を押します。

[code]

    import UIKit
    
    class ViewController: UIViewController {
    
        var textView: UITextView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let saveButton = UIButton(frame: CGRect(x: 20.0, y: 80.0, width: 120.0, height: 44.0))
            saveButton.setTitleColor(saveButton.tintColor, forState: UIControlState.Normal)
            saveButton.setTitle("Save", forState: UIControlState.Normal)
            saveButton.addTarget(self, action: "saveDictionary:", forControlEvents: UIControlEvents.TouchUpInside)
            self.view.addSubview(saveButton)
    
            let readButton = UIButton(frame: CGRect(x: 220.0, y: 80.0, width: 120.0, height: 44.0))
            readButton.setTitleColor(saveButton.tintColor, forState: UIControlState.Normal)
            readButton.setTitle("Read", forState: UIControlState.Normal)
            readButton.addTarget(self, action: "readFile:", forControlEvents: UIControlEvents.TouchUpInside)
            self.view.addSubview(readButton)
    
            textView = UITextView(frame: CGRect(x: 20.0, y: 140.0, width: 280.0, height: 280.0))
            textView.backgroundColor = UIColor.lightGrayColor()
            textView.editable = false
            self.view.addSubview(textView)
        }
    
        func saveDictionary(sender: AnyObject) {
            let paths = NSSearchPathForDirectoriesInDomains(
                .DocumentDirectory,
                .UserDomainMask, true)
            let documentsPath = paths[0] as NSString
            let path = documentsPath.stringByAppendingPathComponent("datastore.plist")
            print(paths)
            let user:NSDictionary = [
                "Name": "A",
                "Age": "B",
                "Sex": "C",
            ]
    
            let success = user.writeToFile(path, atomically: true)
    
            //print(success)
            if success {
                print("success!")
            } else {
                print("failure!")
            }
        }
    
        func readFile(sender: AnyObject) {
            let paths = NSSearchPathForDirectoriesInDomains(
                .DocumentDirectory,
                .UserDomainMask, true)
            let documentsPath = paths[0] as NSString
            let path = documentsPath.stringByAppendingPathComponent("datastore.plist")
            let theDict = NSDictionary(contentsOfFile: path)
            if theDict != nil {
                textView.text = "\(theDict!)"
            } else {
                print("Failure")
            }
        }
    
    }
    
[/code]

「パスの設定時のエラー」どころか、その100段階前のところで起きているエラーだということがわかりますか？

クラスという形態を持ったプログラムを書くとき、「どこそこには、こういう用途のプログラムを記述する」というきまりごとがあります。表現を変えると、「ルール」ですね。ルールから外れることを書くと、「このままではビルドできません」と警告が出ます。赤色のエラーメッセージですね。  
「原因がわからないため、」と質問者さんはおっしゃいますが、原因はルールに従った記述をしなかったことにあります。エラーにならないためには、まずクラスのプログラムをするルールを勉強しましょう。エラーメッセージは、そのルールに従った上で、なおおかしなところがあるという前提のものなので、ダイレクトに間違った箇所を指摘してはいません。  
きっちりした「ルール」の説明は、専門書にゆだねることにして、ここでは典型的なクラスの記述のパターンを示すことにします。

[code]

    class クラス名 : 継承するスーパークラス名 {
        インスタンス変数（プロパティ）
        イニシアライザ（init()）
        メソッド（func メソッド名()）
    }
    
[/code]

`UIViewController`のサブクラスの場合、初期化処理は、イニシアライザでなく、`viewDidLoad()`メソッドに書くことが推奨されています。（もちろんイニシアライザが不用というわけではありません。）

テストで、実行してみたいプログラムがあるとき、そのプログラムは、ボタンのアクションメソッドの中に実装するといいでしょう。先のサンプルプログラムは、その例です。ボタンを押したら、試したいプログラムが実行されるという形をとります。


CC BY-SA 3.0
2015-11-19T09:36:32.670
19042
2015-11-19T19:21:29.220
2015-11-19T19:21:29.220
7362
7362
19033
answer