将变量值与swift 4.0中的数组值进行比较

时间:2018-05-21 07:34:35

标签: ios swift

Wherever the designation is there those are extra i.e the default value我正在努力获得一位特定用户完成的帖子数量。我在下面的代码中尝试将UserDefaults中的值与cellForAtIndexPath匹配,它会从数据库中提供所有值:

import UIKit

struct OverViewJob: Decodable {
    let id: String
    let c_id: String
    let desig: String
    let exp_from: String
    let location: String
    let edu_qual: String
}

class OverviewViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
    var jobOverViewArray = [OverViewJob]()
    @IBOutlet weak var jobTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()


getJobOverviewData()

        //MARK:: getting values by userdefaults

        let companyDefaultValue = UserDefaults.standard
        if let userID = companyDefaultValue.string(forKey: "user_type_id"){
            print("User type ID=\(userID)")
        }
    }

func getJobOverviewData()
        {
            let jobUrl = URL(string: "http://172.16.1.22/Get-Job-API/get-jobs/")
            URLSession.shared.dataTask(with: jobUrl!) { (data, response, error) in
                do
                {
                    if error == nil
                    {
                        self.jobOverViewArray = try JSONDecoder().decode([OverViewJob].self, from: data!)
                        for mainJobArr in self.jobOverViewArray
                        {
                            DispatchQueue.main.async {
                                self.jobTableView.reloadData()
                            }
                        }
    let companyDefaultValue = UserDefaults.standard
                        if let userID = companyDefaultValue.string(forKey: "user_type_id"){
                            print("Company ID or user type ID=\(userID)")
                            self.jobFilterOverviewArray = self.jobOverViewArray.filter {$0.company_id == userID}
                            print("Filter job =\(self.jobFilterOverviewArray)")
                            print("Main Array=\(self.jobOverViewArray)")
                        }
                        print("Job Data****\(self.jobOverViewArray)")
                    }
                }
                catch
                {
                    //                print("my data=\(self.mainCellData)")
                    print("Error in get JSON Data\(error)")
                }
                }.resume()
        }ray.count
        }

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
            if jobTableView.isHidden == false{
                let cell = Bundle.main.loadNibNamed("VendorJobPostTableViewCell", owner: self, options: nil)?.first as! VendorJobPostTableViewCell
                let companyDefaultValue = UserDefaults.standard
                let userID = companyDefaultValue.string(forKey: "user_type_id")
                let overviewJobData = jobOverViewArray[indexPath.row]
                if userID == overviewJobData.company_id{
                    print("cell userID fetch=\(String(describing: userID))")
                    print("cell companyID fetch=\(overviewJobData.company_id)")
                    cell.LabelOne.text = overviewJobData.desig
                    cell.lblTwo.text = overviewJobData.exp_from
                    cell.lblThree.text = overviewJobData.location
                    cell.lblFour.text = overviewJobData.edu_qual
                }
                return cell
            }
        }

4 个答案:

答案 0 :(得分:2)

我认为这是this的后续问题。如果你在那里注意我的答案,你可以拿出解决方案。但似乎你没有仔细尝试理解答案。

您只需要filter方法。

在您的其他问题I applied filter as:

override func viewDidLoad() {
    super.viewDidLoad()
    // Here you apply your filter
    filteredArray = arrayOne.filter { $0.cellID == $0.cellID2 }
}

请看上面的代码段,我告诉filter只找到符合条件的项目:

{ $0.cellID == $0.cellID2 }

你可能会对 $0 感到困惑。这是一个速记。如果你想知道幕后的情况,那就让我们来看看:

override func viewDidLoad() {
    super.viewDidLoad()
    // Here you apply your filter
    filteredArray = arrayOne.filter({ (elementOfArray) -> Bool in
        return elementOfArray.cellID == elementOfArray.cellID2
    })
}

因此filter期望关闭类型(ArrayElementType) -> Bool。因此,在闭包内部,您将获得数组元素,并且必须根据您的要求返回Bool类型来满足返回类型。

在您的其他问题中,您希望通过匹配struct的两个属性进行比较。但是在这里,你想要与普通String匹配。所以它应该与我已经回答的非常不同。您只需使用您拥有的普通struct替换String的其中一个属性,并使用您想要匹配的实际属性。

类似的东西:

override func viewDidLoad() {
    super.viewDidLoad()
    // Here you apply your filter
    filteredArray = arrayOne.filter { $0.cellID == "string from your user defaults key" }
}

编辑:

override func viewDidLoad() {
    super.viewDidLoad()
    //MARK:: getting values by userdefaults

    let companyDefaultValue = UserDefaults.standard
    if let userID = companyDefaultValue.string(forKey: "user_type_id"){
        print("User type ID=\(userID)")
        jobFilterOverviewArray = jobOverViewArray.filter{ $0.company_id == userID }
    }
}
  

不要忘记使用jobFilterOverviewArray作为您的数据源。就像func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int)方法一样。

答案 1 :(得分:2)

您需要在加载表格之前过滤jobOverViewArray

您需要在此处查看哪些过滤条件,检查jobOverViewArray具有的内容并使用在显示前过滤数据所需的任何过滤条件

override func viewDidLoad() {
        super.viewDidLoad()
        //MARK:: getting values by userdefaults

        let companyDefaultValue = UserDefaults.standard
        if let userID = companyDefaultValue.string(forKey: "user_type_id"){
            print("User type ID=\(userID)")

        // **$0.id** filter with id   check what you want and write it 
            jobOverViewArray = jobOverViewArray.filter {$0.id == userID}
        }




    }

答案 2 :(得分:1)

虽然你得到了答案,但我发现了一些不一致的地方,例如通过迭代jobOverViewArray.count重新加载表再次检查cellForRowAtIndexPath中的count_id 。您可以按如下方式更新代码:

注意:我想您只需要显示其c_id == user_type_id

的OverViewJob
struct OverViewJob: Decodable {
    let id: String
    let c_id: String
    let desig: String
    let exp_from: String
    let location: String
    let edu_qual: String
}

class OverviewViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var jobOverViewArray = [OverViewJob]()
    var jobFilterOverviewArray = [OverViewJob]()

    @IBOutlet weak var jobTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        getJobOverviewData()
    }

    func getJobOverviewData() {
        let jobUrl = URL(string: "http://172.16.1.22/Book-My-BIM-API/Get-Job-API/get-jobs/")
        URLSession.shared.dataTask(with: jobUrl!) { (data, response, error) in
            do {
                if error == nil {
                    self.jobOverViewArray = try JSONDecoder().decode([OverViewJob].self, from: data!)
                    let companyDefaultValue = UserDefaults.standard
                    if let userID = companyDefaultValue.string(forKey: "user_type_id") {
                        print("Company ID or user type ID = \(userID)")
                        self.jobFilterOverviewArray = self.jobOverViewArray.filter{ $0.c_id == userID }
                    }

                    // Reload table view
                    DispatchQueue.main.async {
                        self.jobTableView.reloadData()
                    }
                }
            } catch {
                print("Error in get JSON Data\(error)")
            }
            }.resume()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return jobFilterOverviewArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = Bundle.main.loadNibNamed("VendorJobPostTableViewCell", owner: self, options: nil)?.first as! VendorJobPostTableViewCell

        let overviewJobData = jobFilterOverviewArray[indexPath.row]
        cell.LabelOne.text = overviewJobData.desig
        cell.lblTwo.text = overviewJobData.exp_from
        cell.lblThree.text = overviewJobData.location
        cell.lblFour.text = overviewJobData.edu_qual

        return cell
    }
}

答案 3 :(得分:0)

更新此行

if userID == overviewJobData.company_id{

使用以下内容然后检查。

let companyId = overviewJobData.company_id as? String
if (userID == companyid){

这样可行。