文字をIntに変換したいだけです。
これは簡単なはずです。しかし、以前の回答が役に立たなかった。常に何らかのエラーがあります。おそらく、これはSwift 2.0。
for i in (unsolved.characters) {
fileLines += String(i).toInt()
print(i)
}
In Swift 2.0、toInt()
などは、初期化子に置き換えられました。この場合、Int(someString)
。)
すべての文字列をintに変換できるわけではないため、この初期化子はfailableです。つまり、Int
ではなくoptional 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
にマッピングした非nilの結果を含むself
」を返します... Int(String($0))
がnil
の場合、結果は破棄されます。
これは私が思いついたちょっとした即興トリックです。 Character
をInt
に変換するのは難しいかもしれませんが、String
をInt
に簡単に変換できます。
fileLines = Int(String(i))!
もちろん、これはあまり最適化されていませんが、あなたのような場合にはトリックを行うことができます。
実際に。より簡単な方法は、Swift 2.oでStringをIntに変換することです。
let chars = Int(chars)
これがあなたがしようとしているものかどうかはわかりませんが、もちろんこれをループに簡単に適用できます。
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
OPの問題の解決策:
let fileLines = unsolved.compactMap{ Int(String($0) }
// fileLines = [1, 2, 3]
最新の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")
}