2016-11-17 7 views
1

私はSwiftを使い慣れていて、Webページからjsonを解析するアプリケーションを作成しようとしています。しかし、エラーが発生しました "[辞書]の値をサブスクリプトできません"Swift 3の値をサブスクリプトできません。

どうすればこの問題を解決できますか?複数回発生します。以下は私のコードです。ありがとう!

func grabData(results: [Dictionary<String, Any?>]){ 
    guard let resultList = results as? [Dictionary<String, Any?>] else { return } 
     for iResult in resultList { 
      var tempResult = SearchResult() 
      tempResult.studentId = self.getInt(dict: [iResult], string: "StudentId") 
      tempResult.LastName = self.getString(dict: [iResult], string: "LastName") 
      tempResult.FirstName = self.getString(dict: [iResult], string: "FirstName") 
      tempResult.Major = self.getString(dict: [iResult], string: "Major") 
      tempResult.Year = self.getString(dict: [iResult], string: "Year") 
      tempResult.GPA = self.getDouble(dict: [iResult], string: "GPA") 
      self.results.append(tempResult) 
     } 
    DispatchQueue.main.async { 
     self.listTableView.reloadData() 
    } 
} 

func getString(dict: [Dictionary<String, Any?>], string: String) -> String? { 
    if let result = dict[Dictionary<String, Any?>] as? String { 
     return result 
    } 
    return nil 
} 

func getInt(dict: [Dictionary<String, Any?>], string: String) -> Int? { 
    if let result = dict[string] as? Int { 
     return result 
    } 
    return nil 
} 

func getDouble(dict: [Dictionary<String, Any?>], string: String) -> Double? { 
    if let result = dict[string] as? Double { 
     return result 
    } 
    return nil 
} 
+0

JSONの解析にライブラリを使用したい場合は、これでかなり簡単になります。https://github.com/borchero/WebParsingで入手できるライブラリを作成しました。 – borchero

+1

スウィフトディクショナリで任意の値の型を宣言しないようにしてください。彼らはあまり意味がありません。 – vadian

答えて

0

SearchResult.swift

struct SearchResult { 
    let studentID: Int 
    let lastName: String 
    let firstName: String 
    let major: String 
    let year: String 
    let gpa: Double 

    init?(json: [String:AnyObject]) { 
     guard let studentID = json["StudentID"] as? Int else { 
      return nil 
     } 

     guard let lastName = json["LastName"] as? String else { 
      return nil 
     } 

     guard let firstName = json["FirstName"] as? String else { 
      return nil 
     } 

     guard let major = json["Major"] as? String else { 
      return nil 
     } 

     guard let year = json["Year"] as? String else { 
      return nil 
     } 

     guard let gpa = json["GPA"] as? Double else { 
      return nil 
     } 

     self.studentID = studentID 
     self.lastName = lastName 
     self.firstName = firstName 
     self.major = major 
     self.year = year 
     self.gpa = gpa 
    } 
} 

ViewController.swift

func grabData(json: [String:AnyObject]) { 
    guard let searchResult = SearchResult(json) else { 
     return 
    } 

    self.results.append(searchResult) 

    DispatchQueue.main.async { 
     self.listTableView.reloadData() 
    } 
} 

私はRESTのAPIと対話するために私のモデルを設計する際に、このポストは私に役立ちました:https://developer.apple.com/swift/blog/?id=37

JSONの構造も違いを生みます。例えば

[ 
    { 
     "StudentID": 12345, 
     "LastName": "Smith" 
    } 
] 

[[String:AnyObject]](文字列とANYOBJECT組み合わせのアレイ)として表現される

これを持っている場合は、をループする必要があり、その後、個々の要素を解析します。

+0

これは非常に役に立ちました。しかし、今私はこの行にエラーが発生しています..."String:AnyObject"をどのように変更する必要がありますか?これは行です。> "self.grabData(json:json as [String:AnyObject])" – tncb

+0

私は助けてくれると嬉しいです。あなたはどんなエラーを出していますか? –

+0

私はここに新しい投稿を作成しました。 http://stackoverflow.com/questions/40663503/cant-convert-value-of-type-swiftありがとう! – tncb

0

こんにちはあなたは

[String: Any] 

にご

[Dictionary<String, Any?>] 

を変更してみてくださいそして、私は アップル製のこの記事を見て、あなたをお勧めします。 (何が間違っていることは、理解のお手伝いをする必要があります):

dict: [Dictionary<String, Any?>] 

代わりにする必要があります:あなたは辞書の配列を渡しているよう

https://developer.apple.com/swift/blog/?id=37

0

それは私には見えます

dict: Dictionary<String, Any?> 

次に、次のようなものを使用する場合:

if let result = dict[string] as? Int 
+0

ありがとうございます。私はエラーを取り除くことができましたが、今私のアプリケーションは、データを印刷していないので正しく解析していません。私はstackoverflowに新しいです、私はこのコメントやメインポストにここに私のコードの残りの部分を投稿するのですか? – tncb

+0

私は助けることができてうれしいです。これがあなたの問題を解決するのに役立ちましたら、あなたがその答えを受け入れていただければ幸いです。できるだけ新しい問題を評価し、その問題に関連する関連コードを持つ別の投稿で新しい詳細な質問をすることをお勧めします。 – Frankie

関連する問題