I am playing around with Swift recently. I am doing a search function with custom TableView. I have followed this guy in order to make my search work perfectly, but I a problem at the conversion from NSArray to Swift Array.
Here is my code.
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
}
Class Process
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
}
}
I have printed the array and the result is like this.
array: (
"< X.Process: 0x7f8bc94cfa50>"
)
After the conversion which is filtered. I get an empty array which hit me the EXC_BAD_INSTRUCTION.
Is there anyway to convert my NSArray to Swift Array without affect my data inside the NSArray?
Thank you
Process, and in filter array you try to convert it to optionalStringi.e the reason your filter array contains empty string object.