Фильтровать массив по второму массиву, когда оба массива определены его собственной структурой - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь отфильтровать DataArray по CaseDataArray, где dataName в DataArray совпадает с dataName в CaseDataArray. Как видно из кода, каждый массив определяется своей собственной структурой. Я отметил строку в коде, где мне нужна помощь. Я пытался использовать $ 0 и все, что я могу придумать, но не радости. Я знаю, что на форуме есть ряд похожих вопросов, но никто не видит ответа на эту конкретную ситуацию.

import UIKit
import SQLite

struct Data_On_Case
{
    var dataID: Int64
    var dataName: String
}

struct MyData
{
    let dataID: Int64
    var dataName: String
    var dataType: String?
    var dataDescription: String?
    var pricePaid: Double?
    var shipping: Double?
    var datePurchased: String?
    var dataDuration: String?
    var manufacturer: String?
    var venue: String?
    var performanceLevel: String?
    var dataNotes: String?
    var dataStyle: String?
}

class Test_VC: UIViewController
{
    private let crossRefTable = Table("CrossRefCase_Data")
    private let crossRefRCaseID = Expression<Int64>("CaseID_CaseXRef")
    private let crossRefDataID = Expression<Int64>("DataID_CaseXRef")

    private var theDataArray = [MyData]()
    private let theDataTable = Table("My_Data")
    private let dataID = Expression<Int64>("DataID")
    private let data_Name = Expression<String>("Data_Name")

    private var searchBarShowing: Bool = false
    private var isSearching: Bool = false
    private var searchingArray = [MyData]()
    private var theCurrentArray = [MyData]()

    private var theCaseDataArray = [Data_On_Case]()

    @IBOutlet weak var theSearchBar: UISearchBar!

    override func viewDidLoad()
    {
        super.viewDidLoad()

    }
}

extension Test_VC: UISearchBarDelegate
{
    func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int)
    {
        switch selectedScope
        {
        case 0:
            searchingArray = theDataArray
            isSearching.toggle()

        case 1:

           // Cannot convert value of type '((Data_On_Case) throws -> Bool) throws -> Bool' to expected argument type '(MyData) throws -> Bool'
            // The line below is where I'm stuck. The error is shown above.
            searchingArray = theDataArray.filter(theCaseDataArray.contains(where:  ))

            isSearching = true

            self.theSearchBar.resignFirstResponder()
            theSearchBar.showsScopeBar = true

        default:
            return
        }
    }
}

1 Ответ

1 голос
/ 10 ноября 2019

Используйте filter, как показано ниже,

searchingArray = theDataArray.filter { data in
    return self.theCaseDataArray.contains(where: { $0.dataName == data.dataName })
}
...