Это потому, что метод Scanner.nextInt не использует последний символ новой строки вашего ввода, и, таким образом, эта строка используется в следующем вызове Scanner.nextLine.
Вы столкнетесь с аналогичным поведением, когда вы используете Scanner.nextLine после Scanner.nextInt или любого метода Scanner.nextFoo (кроме самого nextLine).
Обход проблемы:
Scanner.nextLine вызывать после Scanner.nextInt или Scanner.nextFoo, чтобы потреблять остальную часть этой строки, включая новую строкуint option = input.nextInt();
input.nextLine(); // Consume newline left-over
String str1 = input.nextLine();
. Или было бы еще лучше, если вы прочитаете ввод через Scanner.nextLine и преобразуете свой ввод в нужный формат , Например, для целого числа с использованием метода Integer.parseInt(String). int option = 0;
try {
option = Integer.parseInt(input.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
String str1 = input.nextLine();
Вы передаете данные в массив по ссылке, и в каждом цикле вы меняете значение ссылки:
self.aUser.username = object["username"] as! String
self.usersAvailableArray.append(self.aUser)
Попробуйте каждый раз создавать нового пользователя:
var newUser = usersAvailable()
newUser.username = object["username"] as! String
self.usersAvailableArray.append(newUser)
Это происходит потому, что объект, который вы добавляете, приходит из класса из документации к присяге :
Классы являются ссылочными типами
В отличие от типов значений ссылочные типы не копируются, когда они назначаются переменной или константе или когда они передаются функции. Вместо копии вместо этого используется ссылка на один и тот же существующий экземпляр. Вы можете увидеть больше о значениях и ссылках в Swift
blockquote>. Еще одно решение - изменить ваш класс на структуру, как показано ниже, structs different, если классы делают копию значения, когда оно передается вместо передать ссылку.
struct usersAvailable { var username = String() var userAvatar = UIImage() }