web-dev-qa-db-ja.com

Swift 2.0で文字をIntに変換

文字Intに変換したいだけです。

これは簡単なはずです。しかし、以前の回答が役に立たなかった。常に何らかのエラーがあります。おそらく、これはSwift 2.0。

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

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は、「Arraytransformにマッピングした非nilの結果を含むself」を返します... Int(String($0))nilの場合、結果は破棄されます。

47
Aaron Brager

これは私が思いついたちょっとした即興トリックです。 CharacterIntに変換するのは難しいかもしれませんが、StringIntに簡単に変換できます。

fileLines = Int(String(i))!

もちろん、これはあまり最適化されていませんが、あなたのような場合にはトリックを行うことができます。

9
MiladiuM

実際に。より簡単な方法は、Swift 2.oでStringをIntに変換することです。

let chars = Int(chars)

これがあなたがしようとしているものかどうかはわかりませんが、もちろんこれをループに簡単に適用できます。

3
Tuan Anh Vu

Swift 4ソリューション

CharacterStringに変換するには:

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]
3
Declan McKenna

最新の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")
}
0
parametr