错误下标

时间:2016-01-29 20:19:52

标签: arrays json swift

我不久前得到了这个错误,我不确定,错了什么。 Post只是普通的自定义类,有两个String类型和int。

属性
  

web api:http://jsonplaceholder.typicode.com/posts

     

PostService:

class PostService {
var settings:Settings!
init(){

    self.settings = Settings()
}

func getPosts(callback:(NSArray) ->()){
    request(settings.viewPost, callback: callback)


}
func request(url:String , callback:(NSArray) ->() ){


    let nsURL = NSURL(string: url)
    let task = NSURLSession.sharedSession().dataTaskWithURL(nsURL!){(data , repsonse , error) in
        //var error:NSError?
        do {
            let response = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as! NSArray
            callback(response)


        } catch {
            print(error)
        }

    }
    task.resume()
}

}

  

设置:

import Foundation
class Settings {

  var viewPost = "http://jsonplaceholder.typicode.com/posts"

}
  

后:

class Post {
   var _userId:Int
   var _title: String

   init(userid:Int , title:String){
     self._userId = userid
     self._title = title

   }

   func toJSON() ->String{

    return ""
   }
}
  

和tableViewController:

class TableViewController: UITableViewController {
var postsCollection = [Post]()
var service:PostService!

override func viewDidLoad() {
    super.viewDidLoad()

    service = PostService()
    service.getPosts{
        (response) in
        self.loadPosts(response[" "] as! NSArray )
    }
}

func loadPosts(posts:NSArray){
    for post in posts{

        var userId = post["userId"] as! Int
        var title  = post["title"] as! String
        let postObj = Post(userid: userId, title: title)
        postsCollection.append(postObj)
        dispatch_async(dispatch_get_main_queue()){

            self.tableView.reloadData()
        }

    }


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

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 0
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return postsCollection.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

    let post = postsCollection[indexPath.row] as NSData
    cell.textLabel?.text = post._userId
    cell.detailTextLabel = post._title
    return cell
}

为什么错误无法在行

中下标'[Post]'类型的值

1 个答案:

答案 0 :(得分:0)

我不确定这个问题,但这是一个问题。

由于postsCollection具有不同的类型,因此无需转换类型 无论如何NSData是错误的类型。

let post = postsCollection[indexPath.row] // the compiler infers to Post

附注:放置dispatch块以重新加载重复循环后的表格视图以创建Post个实例。在循环的每次迭代中重新加载表视图是非常昂贵的,并不是必需的。

for post in posts {
        ...
}
dispatch_async(dispatch_get_main_queue()){
    self.tableView.reloadData()
}

以下划线开头的(公共)属性非常不寻常(在Swift中)。

PS:还有两个问题

cell.textLabel?.text = String(post._userId)
cell.detailTextLabel?.text = post._title

编辑:简单的工作解决方案,只有两个类

<强> class Post

class Post : CustomStringConvertible {
  var userId:Int
  var title: String

  init(userid:Int , title:String){
    self.userId = userid
    self.title = title
  }

  var description : String { return String(userId) }
}

<强> class TableViewController

class TableViewController: UITableViewController {
var postsCollection = [Post]()

override func viewDidLoad() {
    super.viewDidLoad()

    let url = NSURL(string: "http://jsonplaceholder.typicode.com/posts")
    NSURLSession.sharedSession().dataTaskWithURL(url!){ [unowned self] (data , repsonse , error) in
      if error != nil {
        print(error!)
      } else {
        do {
          let posts = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as! [[String:AnyObject]]
          for post in posts {
            let postObj = Post(userid: post["userId"] as! Int, title: post["title"] as! String)
            self.postsCollection.append(postObj)
          }
          dispatch_async(dispatch_get_main_queue()){
              self.tableView.reloadData()
          }
        } catch let error as NSError {
          print(error)
        }
      }
      }.resume()
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return postsCollection.count }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

        let post = postsCollection[indexPath.row]
        cell.textLabel!.text = String(post.userId)
        cell.detailTextLabel!.text = post.title
        return cell
    }
}