Преобразование символов в Int в Swift 2.0

Я просто хочу преобразовать character в Int.

Это должно быть просто. Но я не нашел предыдущие ответы полезными. Всегда есть какая-то ошибка. Возможно, это потому, что я пробую это в Swift 2.0.

for i in (unsolved.characters) {
  fileLines += String(i).toInt()
  print(i)
}

person Aaron    schedule 11.06.2015    source источник
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что вопрос связан со старой и неподдерживаемой версией компилятора Swift.   -  person Blazej SLEBODA    schedule 11.01.2020


Ответы (5)


В Swift 2.0 toInt() и т. д. были заменены инициализаторами. (В данном случае Int(someString).)

Поскольку не все строки могут быть преобразованы в целые числа, этот инициализатор является отказоустойчивым, что означает, что он возвращает необязательное целое число (Int?) вместо Int. Лучше всего развернуть этот необязательный элемент с помощью if let.

Я не совсем уверен, что вы собираетесь делать, но этот код работает в Swift 2 и выполняет то, что, как я думаю, вы пытаетесь сделать:

let unsolved = "123abc"

var fileLines = [Int]()

for i in unsolved.characters {
    let someString = String(i)
    if let someInt = Int(someString) {
        fileLines += [someInt]
    }
    print(i)
}

Или, для решения Swiftier:

let unsolved = "123abc"

let fileLines = unsolved.characters.filter({ Int(String($0)) != nil }).map({ Int(String($0))! })

// fileLines = [1, 2, 3]

Вы можете сократить это с помощью flatMap:

let fileLines = unsolved.characters.flatMap { Int(String($0)) }

flatMap возвращает «Array, содержащий ненулевые результаты сопоставления transform с self»… поэтому, когда Int(String($0)) равно nil, результат отбрасывается.

person Aaron Brager    schedule 11.06.2015
comment
Спасибо большое! Все работает, за исключением того, что fileLines для меня является массивом целых чисел. var fileLines: [Int] = [] (это говорит о том, что fileLines не может использовать +=) - person Aaron; 11.06.2015
comment
Вы можете использовать метод append или сделать fileLines += [someInt] - person Aaron Brager; 11.06.2015

Это небольшой импровизационный трюк, который я придумал. Поскольку преобразовать Character в Int может быть сложно, но вы можете легко преобразовать String в Int, сделайте следующее:

fileLines = Int(String(i))!

конечно, это не очень хорошо оптимизировано, но для таких случаев, как ваш, это может помочь.

person MiladiuM    schedule 14.10.2016

Фактически. Более простой способ - преобразовать String в Int в Swift 2.o:

let chars = Int(chars)

Не уверен, что это то, для чего вы пытаетесь... Но вы, конечно, можете легко применить это к своему циклу.

person Tuan Anh Vu    schedule 17.09.2015
comment
Это кажется проще. - person JMStudios.jrichardson; 28.09.2015
comment
chars не может быть одновременно новой созданной константой и параметром Int. - person Luca Angeletti; 31.01.2016

Свифт 4 решения

Чтобы преобразовать Character в String:

let digit = Int(String("1"))! 
//Don't force unwrap this if you're not 100% sure your character is a digit

Решение проблемы с ОП:

let fileLines = unsolved.compactMap{ Int(String($0) }
// fileLines = [1, 2, 3]
person Declan McKenna    schedule 27.05.2018

В последних версиях Swift (по крайней мере, в Swift 5) вам не нужно делать дополнительное преобразование в String.

Character имеет свойство wholeNumberValue, которое пытается преобразовать символ в Int и возвращает nil, если символ не представляет целое число.

let char: Character = "5"
if let intValue = char.wholeNumberValue {
    print("Value is \(intValue)")
} else {
    print("Not an integer")
}
person parametr    schedule 23.07.2019