Я пытаюсь сделать простую игру для iOS, чтобы быстро научиться программировать. Пользователь вводит 4-значное число в текстовое поле (цифровая клавиатура с клавиатурой, если это имеет значение), и моя программа должна взять это 4-значное число и поместить каждую цифру в массив. в основном я хочу что-то вроде

userInput = "1234"

Становиться

inputArray = [1,2,3,4]

Я знаю, что преобразовать строку в массив символов очень просто в быстром

var text : String = "BarFoo"
var arrayText = Array(text)
//returns ["B","a","r","F","o","o"]

Моя проблема в том, что мне нужно, чтобы мой массив был заполнен целыми числами, а не символами. Если я конвертирую пользовательский ввод в Int, он становится одним числом, поэтому, если пользователь вводит «1234», массив заполняется [1234], а не [1,2,3,4]

Поэтому я попытался рассматривать вводимые пользователем данные как строку, создать массив из его символов, а затем перебрать элементы этого массива, преобразовать их в Ints и поместить во второй массив, например:

var input : String = textField.text
var inputArray = Array(input)
var intsArray = [Int]()

for var i = 0; i < inputArray.count ; i++ {
    intsArray[i] = inputArray[i].toInt()
}

Но он не компилируется и выдает ошибку: 'Character' does not have a member named 'toint'

Что я делаю не так?

1
Iacopo Boccalari 16 Дек 2014 в 12:05
Если вы хотите 1234 вместо 1,2,3,4, вам не нужен для этого массив. 1234 — это одно значение int.
 – 
Kampai
16 Дек 2014 в 12:09

3 ответа

Лучший ответ

Вы можете использовать:

let text : String = "123a"
let digits = Array(text).map { String($0).toInt()! }
// Crash if any character is not int

Но он выйдет из строя, если ввод недействителен.

Вы можете проверить, проверив результат toInt():

let text : String = "1234"
var digits = Array(text).reduce([Int](), combine: { (var digits, optionalDigit) -> [Int] in
    if let digit = String(optionalDigit).toInt() {
        digits.append(digit)
    }

    return digits
})

if countElements(text) == digits.count {
    // all digits valid
} else {
    // has invalid digits
}
4
Kirsteins 16 Дек 2014 в 12:32
Большое спасибо, первого фрагмента кода достаточно, потому что пользователь может вводить только целые числа, так как я установил тип клавиатуры текстового поля на «Цифровая клавиатура».
 – 
Iacopo Boccalari
16 Дек 2014 в 12:36
Да, это правильный способ получить символы из строки.
 – 
Kampai
16 Дек 2014 в 12:43

Вот гораздо более простое решение для будущих пользователей

let text : String = "12345"
var digits = [Int]()
for element in text.characters 
{
    digits.append(Int(String(element))!)
}
1
travis 17 Ноя 2016 в 06:30

Преобразование строки в расширение [Int] - версия Swift

Ниже я привожу расширения, которые позволяют конвертировать String в [Int]. Это длинная версия, где вы можете увидеть, что происходит в каждой строке с вашей строкой.

extension String {

    func convertToIntArray() -> [Int]? {

        var ints = [Int]()
        for char in self.characters {
            if let charInt = char.convertToInt() {
                ints.append(charInt)
            } else {
                return nil
            }
        }
        return ints
    }
}


extension Character {

    func convertToInt() -> Int? {
        return Int(String(self)) ?? nil
    }
}
0
lukszar 7 Сен 2016 в 16:54