2016-11-18 1 views
0

저는 스위프트로 최근에 놀고 있습니다. 사용자 정의 TableView 검색 기능을 수행하고있다. 내 검색 작업을 완벽하게하기 위해 this 사람을 따라 갔지만 NSArray에서 Swift Array 로의 변환시 문제가 있습니다.NSArray를 스위프트 배열로 변환 한 후 배열이 비어 있습니다.

여기 내 코드입니다.

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을 NSArray 내부 데이터에 영향을 미치지 않고 Swift Array로 변환 할 수 있습니까?

, 당신은 직접처럼 [Process] 배열을 필터링 할 수 있습니다 단지 필터 NSArray에 스위프트 배열 [Process]을 변환 할 필요가 없습니다 당신

+0

있는 tableView 위임 방법의 내용을 추가하십시오 – iMHitesh

+0

proccessArray가 포함되지 않은 문자열을 직접 월 사용자 정의 클래스 객체'프로세스를 포함 '그리고 필터 배열에서 선택적'String'으로 변환하려고합니다. 즉, 필터 배열에 빈 문자열 객체가 들어있는 이유입니다. –

+0

@NiravD 그래서 그것에 대해 무엇을 할 수 있습니까? –

답변

1

감사드립니다. 그런 다음 원하는 경우 귀하의 경우에는

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

contains를 사용할 필요 없지만 :

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

'[Process]'유형의 값을 '[String]'에 할당 할 수 없어이 오류가 발생했습니다 –

+0

이것은 내 코드 "입니다. filtered = self.proccessArray.filter {$ 0.status =="pending "}"$ 0이 무엇인지 알 수 있습니까? –

+0

@DaveCruise 전체 프로세스 객체를 원하기 때문에 'filtered'를'[Process]'로 선언해야합니다. –

관련 문제