2016-09-20 2 views
1

Swiftからプロジェクトを変換したばかりです2.2 to 3.0、私はテストでスローされた新しい例外を取得しています。私は、ファイルから、いくつかのJSONを読み込み私のテストのいずれかで、いくつかのObjective Cのコードがあります:私はいくつかのスウィフトコードからこれを呼んでいるSwift 3 NSDictionaryからDictionaryへの変換でNSInvalidArgumentExceptionが発生する

+ (NSDictionary *)getJSONDictionaryFromFile:(NSString *)filename { 
    /* some code which checks the parameter and gets a string of JSON from a file. 
    * I've checked in the debugger, and jsonString is properly populated. */ 

    NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil]; 
    return jsonDict; 
} 

を:

let expectedResponseJSON = BZTestCase.getJSONDictionary(fromFile: responseFileName) 

これが最もうまくの作品時間のが、私は、エラーが発生し1つのJSONファイルを持っている:

failed: caught "NSInvalidArgumentException", "-[__NSSingleObjectArrayI enumerateKeysAndObjectsUsingBlock:]: unrecognized selector sent to instance 0x608000201fa0" 

このことについて奇妙なことは、エラーが発生したということですgetJSONDictionaryFromFileメソッドが返され、SwiftコードのexpectedResponseJSONが入力されます。私には、これは問題であるNSDictionaryからDictionaryへの変換であると言われています。問題のJSONファイルはこの1つである:私は[]を囲む最も外側を削除した場合

[ 
    { 
    "status": "403", 
    "title": "Authentication Failed", 
    "userData": {}, 
    "ipRangeError": { 
     "libraryName": "Name goes here", 
    "libraryId": 657, 
     "requestIp": "127.0.0.1" 
    } 
    } 
] 

、このエラーが表示されなくなります。 Swift 3でJSONファイルの最上位エンティティとして配列を使用する唯一の人になることはできません。間違っていますか?このエラーを回避するにはどうすればよいですか?

+0

もちろん、最上位のJSONオブジェクトとして配列を使用できます。しかし、辞書としてではなく配列として扱わなければなりません。 –

答えて

4

コメントで参照されているとおり、getJSONDictionaryFromFileNSDictionary *を返し、JSON入力は配列です。唯一の謎は、なぜこれがSwift 2.2で動作するのかということです!私はAny?するexpectedResponseJSONを変えてしまった、とスウィフトの私のObjective Cのコードを書き直しました:このコードを切り取って貼り付けるかもしれない誰にも注意点としては

class func getStringFrom(file fileName: String, fileExtension: String) -> String { 
    let filepath = Bundle(for: BZTestCase.self).path(forResource: fileName, ofType: fileExtension) 
    return try! NSString(contentsOfFile: filepath!, usedEncoding: nil) as String 
} 

class func getJSONFrom(file fileName: String) -> Any? { 
    let json = try! JSONSerialization.jsonObject(with: (getStringFrom(file: fileName, fileExtension: ".json").data(using: .utf8))!, options:.allowFragments) 
    return json 
} 

を、私の代わりにtry?if let...try!filepath!を使用しているためこのコードはテストでのみ使用されるため、私の入力が期待どおりでない場合はできるだけ早くクラッシュするようにします。

関連する問題