Прежде всего, не используйте NSArray
и NSDictionary
в Swift.Используйте нативные типы.Это позволяет избежать таких странных танцев, как NSArray ... as! [Any] as! [[String : Any]]
.
Во-вторых, есть класс PropertyListSerialization
для преобразования Property List
в типы коллекций и наоборот.
Наконец, правильный тип обоихмассивы [[String:String]]
.Избегает ненужного приведения типов.
Пожалуйста, соблюдайте соглашение об именах, что имена переменных начинаются со строчной буквы.
var clientArray = [[String:String]]()
var productArray = [[String:String]]()
override func viewDidLoad() {
super.viewDidLoad()
//URL of plist file Array Client
let clientURL = Bundle.main.url(forResource: "ClientList", withExtension: "plist")!
let clientData = try! Data(contentsOf: clientURL)
clientArray = try! PropertyListSerialization.propertyList(from: clientData, format: nil) as! [[String:String]]
//URL of plist file Array Products
let productURL = Bundle.main.url(forResource: "ProductList", withExtension: "plist")!
let productData = try! Data(contentsOf: productURL)
productArray = try! PropertyListSerialization.propertyList(from: productData, format: nil) as! [[String:String]]
// Do any additional setup after loading the view, typically from a nib.
}
В cellForRow
фильтруйте имя продукта с помощью first
function.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TestCell", for: indexPath) as! TestTableViewCell
//fill out custom cell values
let client = clientArray[indexPath.row]
cell.testName.text = client["name"]
if let product = productArray.first{ $0["productID"]! == client["productID"]! } {
cell.testNumber.text = product["productName"]
}
return cell
}
Более эффективное решение заключается в декодировании Списка свойств в структуры с PropertyListDecoder
struct Client : Decodable {
let name, number, productID : String
}
struct Product : Decodable {
let productID, productName, productQty : String
}
...
var clients = [Client]()
var products = [Product]()
override func viewDidLoad() {
super.viewDidLoad()
//URL of plist file Array Client
let clientURL = Bundle.main.url(forResource: "ClientList", withExtension: "plist")!
let clientData = try! Data(contentsOf: clientURL)
clients = try! PropertyListDecoder().decode([Client].self, from: clientData)
//URL of plist file Array Products
let productURL = Bundle.main.url(forResource: "ProductList", withExtension: "plist")
let productData = try! Data(contentsOf: productURL)
products = try! PropertyListDecoder().decode([Product].self, from: productData)
}
...
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TestCell", for: indexPath) as! TestTableViewCell
//fill out custom cell values
let client = clients[indexPath.row]
cell.testName.text = client.name
if let product = products.first{ $0.productID == client.productID } {
cell.testNumber.text = product.productName
}
return cell
}
Рассмотрите возможность использования CoreData со связями для модели данных.Это еще более эффективно.