在部分中使用的对象的唯一值

我有一个类,我需要得到stream派对象,放入一个数组,获得唯一值(因为我会有很多),并使用该数组填充tableView的部分。

我有以下代码:

class Movie { var name: String! var plot: String! var imageUrl: String! var genre: String! init(name: String, plot: String, img: String, genre: String) { self.name = name self.plot = plot self.imageUrl = img self.genre = genre } } } import UIKit class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self } var loadMovie = [Movie]() let insertMovie = Movie(name: "Blow", plot: "Blow bla bla bla", img: "", genre: "Action") let insertMovie2 = Movie(name: "BLade", plot: "Blade bla bla bla", img: "", genre: "Action") let insertMovie3 = Movie(name: "Inside Out", plot: "Blow bla bla bla", img: "", genre: "Kids") let insertMovie4 = Movie(name: "Titanic", plot: "Blow bla bla bla", img: "", genre: "Drama") loadMovie.append(insertMovie) loadMovie.append(insertMovie2) loadMovie.append(insertMovie3) loadMovie.append(insertMovie4) let unique = NSSet(array: loadMovie.map { $0.genre }) 

独特的回报独特的价值(动作,戏剧,童装),但是当我试图得到部分:

 func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return unique[section].genre } func numberOfSectionsInTableView(tableView: UITableView) -> Int { return unique.count } 

它不工作。

我错在哪里?

每次重新加载表格视图时按stream派过滤电影是相当昂贵的。

这是一个解决scheme,使用一个标题(stream派)名称数组和一个包含每个stream派[Movie]数组分别分别。

 var unique = [String]() var loadMovie = [String:[Movie]]() 

添加一个插入电影的方法。 逻辑是:

•如果存在stream派,请将该stream派的影片添加到字典中的[Movie]数组中。
•如果stream派不存在,请将stream派添加到uniquearrays,并将电影添加到字典中。

 func insertMovie(movie : Movie) { let genre = movie.genre if unique.contains(genre) { loadMovie[genre]!.append(movie) } else { unique.append(genre) loadMovie[genre] = [movie] } } 

现在插入电影

 let movie = Movie(name: "Blow", plot: "Blow bla bla bla", img: "", genre: "Action") insertMovie(movie) let movie2 = Movie(name: "BLade", plot: "Blade bla bla bla", img: "", genre: "Action") insertMovie(movie2) let movie3 = Movie(name: "Inside Out", plot: "Blow bla bla bla", img: "", genre: "Kids") insertMovie(movie3) let movie4 = Movie(name: "Titanic", plot: "Blow bla bla bla", img: "", genre: "Drama") insertMovie(movie4) 

相关的数据源和委托方法是

 override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return unique[section] } override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return unique.count } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let genre = unique[section] return loadMovie[genre]!.count } 

cellForRowAtIndexPath填充单元格

 ... let genre = unique[indexPath.section] let movie = loadMovie[genre]![indexPath.row] cell.textLabel!.text = movie.name ... 

另一种方法是数组

Swift 4的更新

 func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return unique[section] } func numberOfSections(in tableView: UITableView) -> Int { return unique.count } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let genre = unique[section] return loadMovie[genre]!.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "basicCell", for: indexPath) let genre = unique[indexPath.section] let movie = loadMovie[genre]![indexPath.row] cell.textLabel!.text = movie.name return cell }