Swift Добавление объектов из массива в другой массив правильно?

Итак, у меня есть 2 NSMutableArrays, один называется testArray, а другой - jsonArray. jsonArray получает свои объекты с сервера MySQL, используя json и php. Затем те же самые объекты в jsonArray вставляются в testArray. Я сделал print (jsonArray, testArray) и то, что показывалось в журналах, было следующим.

У меня также есть класс NSObject с именем Test, если это помогает..

Для jsonArray

 {
  testName = GreenCorn;
  testStatus1 = 12;
  testStatus2 = 13;
  testURL = "";
  id = 1;
 }

Для testArray

"<CustomCellSwift.Test: 0x17414df70>"

Теперь я новичок в iOS Swift, но я не знаю, правильно ли я вставил jsonArray в testArray. Вот код, который я использовал. Кроме того, я использую настраиваемый табличный вид, и он должен показывать testArray.count, его пустые ячейки, но он показывает несколько строк, которые есть в jsonArray.

var followedArray: NSMutableArray = []
var testArray: NSMutableArray = []

var jsonArray: NSMutableArray = []
var filteredArray: NSArray = []

var isFiltered: Bool = false


// Number of Rows in Section
internal func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if !isFiltered {
        if section == 0 {
            return followedArray.count
        }
        else if section == 1 {
            return testArray.count
        }
    }
    return filteredArray.count

}


internal func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let CellIdentifier = "Cell"
    var cell = tableView.dequeueReusableCell(withIdentifier: CellIdentifier) as! CustomCell

    if cell != cell {
        cell = CustomCell(style: UITableViewCellStyle.default, reuseIdentifier: CellIdentifier)
    }

    // Coloring TableView
    myTableView.backgroundColor = UIColor.white

    // Configuring the cell
    var testObject: Test

    print("before ifFiltered")

    if !isFiltered {
        if indexPath.section == 0 {
            print("isFiltered if")
            testObject = followedArray[indexPath.row] as! Test
            cell.populateCell(testObject, isFollowed: true, indexPath: indexPath, parentView: self)
        }
        else if indexPath.section == 1 {
            print("isFiltered if 2")
            testObject = testArray[indexPath.row] as! Test
            cell.populateCell(testObject, isFollowed: false, indexPath: indexPath, parentView: self)
        }
    }
    else {
        print("isFiltered else")
        testObject = filteredArray[indexPath.row] as! Test
        cell.populateCell(testObject, isFollowed: false, indexPath: indexPath, parentView: self)
    }

    return cell
}





// Retrieving Data from Server
func retrieveData() {

    let getDataURL = "http://exampleip.org/json.php"
    let url: NSURL = NSURL(string: getDataURL)!

    do {

        let data: Data = try Data(contentsOf: url as URL)
        jsonArray = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! NSMutableArray

        // Setting up testArray
        let testArray: NSMutableArray = []

        // Looping through jsonArray
        for i in 0..<jsonArray.count {

            // Create Test Object
            let tID: String = (jsonArray[i] as AnyObject).object(forKey: "id") as! String
            let tName: String = (jsonArray[i] as AnyObject).object(forKey: "testName") as! String
            let tStatus1: String = (jsonArray[i] as AnyObject).object(forKey: "testStatus1") as! String
            let tStatus2: String = (jsonArray[i] as AnyObject).object(forKey: "testStatus2") as! String
            let tURL: String = (jsonArray[i] as AnyObject).object(forKey: "testURL") as! String

            // Add Test Objects to Test Array
            testArray.add(Test(testName: tName, andTestStatus1: tStatus1, andTestStatus2: tStatus2, andTestURL: tURL, andTestID: tID))

            print("retrieveData")
            print(jsonArray, testArray)
        }

    }
    catch {
        print("Error: (Retrieving Data)")
    }

    myTableView.reloadData()
}

Я делаю это правильно? Почему в моем табличном представлении есть пустые ячейки?

2 ответа

Решение

Удаление этой строки кода сработало.

let testArray: NSMutableArray = []

Во-первых, код вашей сети / сериализации не должен быть в вашем ViewController, но это лучший способ сделать что-то:

func retrieveData() {

    let getDataURL = "http://exampleip.org/json.php"
    let url: NSURL = NSURL(string: getDataURL)!

    do {

        let data: Data = try Data(contentsOf: url as URL)
        guard let jsonArray = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [[String : AnyObject]] else {
            print("Error Retrieving Data")
            return
        }

        let testArray = jsonArray.flatMap(Test.init)

        // make sure the add the result in your viewController
        self.myTableView.models = testArray
    }
    catch {
        print("Error: (Retrieving Data)")
    }

    myTableView.reloadData()
}

extension Test {

    convenience init?(with jsonDictionary: [String : AnyObject]) {
        guard let tID = jsonDictionary["id"] as? String, let tName = jsonDictionary["testName"] as? String, let tStatus1 = jsonDictionary["testStatus1"] as? String, 
              let tStatus2 = jsonDictionary["testStatus2"] as? String, let tURL = jsonDictionary["testURL"] as? String else {
            return nil
        }
        self(testName: tName, andTestStatus1: tStatus1, andTestStatus2: tStatus2, andTestURL: tURL, andTestID: tID)
    }
}

Я не мог действительно проверить это, поэтому могут быть некоторые ошибки, но это должно указать вам правильное направление.

Другие вопросы по тегам