2016-11-18 4 views
0

Недавно я играю с Swift. Я выполняю функцию поиска с помощью пользовательского TableView. Я последовал за this парнем, чтобы сделать мой поиск отлично, но я проблема при преобразовании из NSArray в Swift Array.Массив пуст после преобразования NSArray в Swift Array

Вот мой код.

func updateSearchResultsForSearchController(searchController: UISearchController) { 
    filtered.removeAll(keepCapacity: false) 
    proccessArray.removeAll(keepCapacity: false) 
    print("start") 
    var array = [] 
    for i in 0...arrProcessName.count{ 
     if(arrProcessName[safe: i] != nil && arrRequestedBy[safe: i] != nil && arrCreationTime[safe: i] != nil && arrStatus[safe: i] != nil) 
     { 
      var newProcess = Process(process: arrProcessName[i], requestor: arrRequestedBy[i], time: arrCreationTime[i], status: arrStatus[i]) 
      self.proccessArray.append(newProcess) 
     } 
    } 
    print("array: ", proccessArray) 
    let searchPredicate = NSPredicate(format: "status CONTAINS[c] %@", "pending") 
    array = (proccessArray as NSArray).filteredArrayUsingPredicate(searchPredicate) 
    print("array: ", array) 
    let arr2 = (array as Array).map { $0 as? String ?? "" } 
    filtered = arr2 
    print("filtered: ", filtered) 

    if(filtered.count == 0){ 
        searchActive = false; 
       } else { 
        searchActive = true; 
       } 
    tableView?.reloadData() 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    removeProgressBar() 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! HistoryCustomCell 

    cell.selectionStyle = .None 
    cell.accessoryType = UITableViewCellAccessoryType.None 

    if self.searchCtrler.active { 
     print("processArray: ",proccessArray[indexPath.row].status as String!) 
     cell.lbl_status.text = proccessArray[indexPath.row].status as String! 
    } else { 
     cell.lbl_request_name.text = arrProcessName[indexPath.row] 
     cell.lbl_requested_by.text = "Requested by: " + arrRequestedBy[indexPath.row] 
     cell.lbl_creation_time.text = arrCreationTime[indexPath.row] 
     cell.lbl_status.text = arrStatus[indexPath.row] 

     switch arrStatus[indexPath.row] { 
      case "Completed", "Approved": 
       cell.img_status.image = UIImage(named: "ic_approved") 
      case "Running", "Processing", "Pending": 
       cell.img_status.image = UIImage(named: "ic_pending") 
      case "Denied", "Rejected": 
       cell.img_status.image = UIImage(named: "ic_reject") 
      case "Error": 
       cell.img_status.image = UIImage(named: "ic_terminated") 
      case "Retracted": 
       cell.img_status.image = UIImage(named: "ic_retracted") 
      default: 
       cell.img_status.image = UIImage(named: "") 
     } 
    } 

    return cell 
} 

Процесс Класс

import Foundation 

class Process:NSObject{ 
var process: NSString! 
var requestor: NSString! 
var time: NSString! 
var status: NSString! 

init(process:NSString, requestor:NSString, time: NSString, status: NSString){ 
    self.process = process 
    self.requestor = requestor 
    self.time = time 
    self.status = status 
} 

} 

Я напечатал массив и результат, как это.

array: (
    "< X.Process: 0x7f8bc94cfa50>" 
) 

После преобразования, которое фильтруется. Я получаю пустой массив, который ударил меня EXC_BAD_INSTRUCTION.

Есть ли способ конвертировать мой NSArray в Swift Array, не затрагивая мои данные внутри NSArray?

Спасибо

+0

Пожалуйста, добавьте Tableview методов делегируют содержание – iMHitesh

+0

proccessArray не содержит строку непосредственно он может содержит пользовательский объект класса 'процесс ', а в массиве фильтров вы пытаетесь преобразовать его в необязательный' String', то есть причину, в которой ваш фильтр содержит пустой объект строки. –

+0

@NiravD, так что я могу с этим поделать? –

ответ

1

Там нет необходимости конвертировать Swift массив [Process] в NSArray только для фильтра, вы можете напрямую фильтровать [Process] массив, как это.

let filterProcess = self.proccessArray.filter { $0.status == "pending" } 

В вашем случае нет необходимости использовать contains, но если вы хотите, то:

let filterProcess = self.proccessArray.filter { $0.status.localizedCaseInsensitiveContainsString("pending") } 
+0

, я ударил эту ошибку, не могу присвоить значение типа '[Process]' для ввода '[String]' –

+0

это мой код "filter = self.proccessArray.filter {$ 0.status ==" pending "}" может я знаю, что означает $ 0? –

+0

@DaveCruise Вы должны объявить свой 'filter' также как' [Process] 'не как' [String] ', потому что вы хотите, чтобы весь объект процесса –

 Смежные вопросы

  • Нет связанных вопросов^_^