要在节中使用的对象的唯一值

时间:2016-02-17 12:55:49

标签: ios swift uitableview unique

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

我有以下代码:

DROP FUNCTION if exists stack_test(integer[]);

CREATE OR REPLACE FUNCTION stack_test(integer[])
  RETURNS text AS
$BODY$
declare 
rec record;
sql text;

select_field_sum text;
core_crostab_1 text;
core_crostab_2 text;
ct_field_list text ;

begin

select_field_sum ='0.0';
core_crostab_1   ='';
core_crostab_2   ='';
ct_field_list    ='';

FOR rec IN select unnest(( $1)) i  order by 1
   loop
   ct_field_list     =  ct_field_list ||',wk' || (rec.i)::text  || ' numeric'  ;
   select_field_sum  =  select_field_sum ||  '+coalesce(wk' || (rec.i)::text|| ',0)' ;   
   end loop;

core_crostab_1  = 'select advisor_id, week_number,sum(premium) premium from policies  where week_number = any ( array['|| array_to_string($1, ',') ||'] ) and policies.current_status=''''T'''' or policies.current_status=''''I'''' group by advisor_id,week_number order by 1,2';
core_crostab_2  = 'select unnest((array['|| array_to_string($1, ',') ||']  )) order by 1';

sql  = 'select *, ('||select_field_sum||') premiumsum  from crosstab('''||core_crostab_1||''', '''||core_crostab_2||''') as ct(advisor_id integer '||  ct_field_list ||') ';
sql = 'select recruiters.full_name as requiter,advisors.advisor ,q1.* from ( '||sql||')q1 left join advisors on(q1.advisor_id= advisors.id )  left join recruiters on (advisors.recruiter_id = recruiters.id) order by 1,2';

return  sql::text;
 end;
$BODY$
  LANGUAGE plpgsql volatile
  COST 100;

unique返回唯一值(Action,Drama,Kids),但是当我尝试获取部分时:

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 })

它没有用。

我哪里错了?

2 个答案:

答案 0 :(得分:1)

每次重新加载表视图时按类型过滤电影都非常昂贵。

这是一个解决方案,它使用一个标题(流派)名称数组和一个包含每个类型的[Movie]数组的字典。

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

添加插入影片的方法。逻辑是:

•如果类型存在,请将该类型的电影添加到字典中的[Movie]数组中。
•如果类型不存在,请将类型添加到unique数组,将电影添加到字典中。

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
...

另一种选择是数组数组

答案 1 :(得分:0)

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
}