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

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

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

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

Ответ 1

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

Поскольку не все строки могут быть преобразованы в int, этот инициализатор не работает, что означает, что он возвращает необязательный int (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 возвращает "a Array, содержащий не-nil результаты отображения transform над self"... поэтому, когда Int(String($0)) является nil, результат отбрасывается.

Ответ 2

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

fileLines = Int(String(i))!

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

Ответ 3

На самом деле. Более простой способ - преобразовать String в Int в Swift 2.o:

let chars = Int(chars)

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

Ответ 4

Swift 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]

Ответ 5

В последних версиях 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")
}