Проблема кода Swift - попытка преобразовать объекты из NSMutableArray как пользовательский объект - PullRequest
0 голосов
/ 04 февраля 2020

Вот мой код, и он не может быть выполнен, как указано ниже.

Я пытаюсь привести объект к моему пользовательскому типу данных, называемому UserData. Первая проблема, с которой я столкнулся - это не понять, как правильно вывести значение из массива. Во-вторых, я не могу представить объект как нужный мне тип, UserData. Что я делаю не так?

    func parseJSON(_ data:Data) {

        var jsonResult = NSArray()
        var users = NSMutableArray();

        do{
            jsonResult = try JSONSerialization.jsonObject(with: data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray
        } catch let error as NSError {
            print(error)
        }

        var jsonElement = NSDictionary()
        for i in 0 ..< jsonResult.count {

            print("loop count :", i );

            jsonElement = jsonResult[i] as! NSDictionary

            let user = UserData()

            //the following insures none of the JsonElement values are nil through optional binding
            if let UserID = jsonElement["Userid"] as? String,
                let firstName = jsonElement["First_Name"] as? String,
                let lastName = jsonElement["Last_Name"] as? String,
                let userSessionID = jsonElement["Session_ID"] as? String
            {

                user.UserID = UserID
                user.FirstName = firstName
                user.LastName = lastName
                user.UserSessionID = userSessionID

                print("users firstName:", user.FirstName ?? "blank");

            }

            users.add(user)
        }

        print("users size:", users.count); // this shows 2 
        // So i know I have data loaded... BUT when i try and 
        // get it then it all goes to heck. See below


        // NOT SURE what I am doing here...
        // Thought it was java like where I could just get a
        // item from the NSMutableArray using an index value
        // then cast it as my UserData object
        // and print the output... but this does not work 
        // Why is this so hard?? 

        let userDataVal = users.index(of: 0) as! UserData;
        print("firstName:", userDataVal.FirstName);

    }

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Ниже я бы описал эту функцию. Некоторые комментарии

  • Классы NS не используются, вместо этого я использую собственные массивы и словари
  • Если JSONSerialization.jsonObject выдает ошибку, функция завершается
  • Local переменные определены как можно ближе к тому месту, где они используются
  • Создайте метод init для вашего UserData struct / class, который принимает значения в качестве параметров, чтобы вы могли вместо этого сделать let user = UserData(userId: UserId, firstName:....
  • Называйте локальные переменные и свойства первым символом в нижнем регистре, это облегчает чтение кода

func parseJSON(_ data:Data) {
    var jsonResult: [[String: Any]]?
    do {
        jsonResult = try JSONSerialization.jsonObject(with: data, options:JSONSerialization.ReadingOptions.allowFragments) as? [[String: Any]]
    } catch let error as NSError {
        print(error)
        return
    }

    guard let result = jsonResult else {
        return
    }

    var users = [UserData]()
    for jsonElement in result {
        if let UserID = jsonElement["Userid"] as? String,
            let firstName = jsonElement["First_Name"] as? String,
            let lastName = jsonElement["Last_Name"] as? String,
            let userSessionID = jsonElement["Session_ID"] as? String
        {
            var user = UserData()
            user.UserID = UserID
            user.FirstName = firstName
            user.LastName = lastName
            user.UserSessionID = userSessionID
            users.append(user)
        }
    }

    for user in users {
        print("firstName:", user.FirstName);
    }
}
0 голосов
/ 04 февраля 2020

Лучше было бы использовать JSONDecoder () вместо JSONSerailizer. Попробуйте использовать следующий код.

struct User: Codable {
    var userId, firstName, lastName, userSessionId: String

    enum CodingKeys: String, CodingKey {
        case userId = "Userid"
        case firstName = "First_Name"
        case lastName = "Last_Name"
        case userSessionId = "Session_ID"
    }
}

func parseJSON(_ data: Data) {
    do {
        let users = try JSONDecoder().decode([User].self, from: data)
        users.forEach { user in
            print("users first name:", user.firstName)
        }
    } catch {
        print(error.localizedDescription)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...