ダーヤス.com プレミアム

ダーヤス.comにようこそ。プレミアムな情報で、ワークライフバランスの充実を図りませんか。

【Xcode】【Swift】NSJSONSerializationのエラー"use of unresolved identifier","Extra argument 'Error' in call"

   

use of unresolved identifier

ひと昔前のSwiftの参考書でJSONを使う場合コードとして、以下のような内容が書いてあると思うのですが、今この通り書くとまあエラーが出ますね。

あらかじめ格納しておくJSONデータは以下の通り。

json.txt

["test1","test2","test3","test4"]

これを読み込んでデバッグエリアのコンソールに表示しようとする場合のViewController.swiftのコード。
(旧)ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func viewWillAppear(animated: Bool) {
        let path = NSBundle.mainBundle().pathForResource("json",ofType:"txt")
        let data = NSData(contentsOfFile: path!)
        
        
        let jsonArray: NSArray =  NSJSONSerialization.JSONObjectWithData(data!, options: nil, error:nil) as! NSArray

        for tmp in jsonArray {
            print("\(tmp)")
        }
  
    }

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

おそらく、上記15行目のところで、Extra argument 'Error' in callというエラーが出ると思います。

これはスタック・オーバーフローのSwift 2を使うとNSJSONSerialization.JSONObjectWithData()でコンパイルエラー 'Extra argument 'error' in call' が発生するというページを参考にして解決できました。

エラー処理に際しては、do,try,catchの構文を使うみたいですね。
なのでerror:nilを消すと、'Nil is not compatible with expected argument type 'NSJSONReadingOptions'とか'Call can throw, but it is not marked with 'try' and the error is not handled'とかさらにエラーが出ますが、options: をnilではなくして冒頭にtryをつける。さらにdo{}catch{}を使います。

これでも、print("\(tmp)")のところで、use of unresolved identifierというエラーが出てどうにも困ります。
まあよくわからないのですが、doの{}カッコ内ならjsonArrayが定義されてるから同じカッコ内に入れてしまえばいいんじゃないかと思って、総合的に以下のように書き換えたらうまくいきました。

(新)ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func viewWillAppear(animated: Bool) {
        let path = NSBundle.mainBundle().pathForResource("json",ofType:"txt")
        let data = NSData(contentsOfFile: path!)

        do{
            let jsonArray: NSArray = try  NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
            for tmp in jsonArray {
                print("\(tmp)")
            }
        }  catch{
                print("error")
        }
        
        
    }

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


}

結果

test1
test2
test3
test4

 - アプリ開発, テクノロジー