私はSwiftで単一の文字列のASCII値を取得したいだけです。これは私が現在それをやっている方法です:
var singleChar = "a"
println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97
これはとてもいです。もっと簡単な方法が必要です。
編集/更新Swift 5
Swift 5では、新しい文字プロパティ isASCII および asciiValue を使用できます
Character("a").isASCII // true
Character("a").asciiValue // 97
Character("á").isASCII // false
Character("á").asciiValue // nil
古い答え
拡張機能を作成できます:
Swift 4.2以降
extension Character {
var isAscii: Bool {
return unicodeScalars.allSatisfy { $0.isASCII }
}
var ascii: UInt32? {
return isAscii ? unicodeScalars.first?.value : nil
}
}
extension StringProtocol {
var ascii: [UInt32] {
return compactMap { $0.ascii }
}
}
Character("a").isAscii // true
Character("a").ascii // 97
Character("á").isAscii // false
Character("á").ascii // nil
"abc".ascii // [97, 98, 99]
"abc".ascii[0] // 97
"abc".ascii[1] // 98
"abc".ascii[2] // 99
UnicodeScalar("1")!.value // returns 49
Swift 3.1
Xcode 7.1では、Swift 2.1
var singleChar = "a"
singleChar.unicodeScalars.first?.value
NSStringの characterAtIndex を使用してこれを実現できます...
var singleCharString = "a" as NSString
var singleCharValue = singleCharString.characterAtIndex(0)
println("The value of \(singleCharString) is \(singleCharValue)") // The value of a is 97
Swift 4.2
ASCII文字列からSwift値を取得する最も簡単な方法は以下のとおりです
let str = "Swift string"
for ascii in str.utf8 {
print(ascii)
}
出力:
83
119
105
102
116
32
115
116
114
105
110
103
私の実装は次のとおりです。ASCII値の配列を返します。
extension String {
func asciiValueOfString() -> [UInt32] {
var retVal = [UInt32]()
for val in self.unicodeScalars where val.isASCII() {
retVal.append(UInt32(val))
}
return retVal
}
}
注:はい、Swift 2互換です。
これを行う少し短い方法は次のとおりです。
first(singleChar.unicodeScalars)!.value
添え字バージョンと同様に、文字列が実際に空の場合、これはクラッシュします。そのため、100%確信がない場合は、オプションを使用します。
if let ascii = first(singleChar.unicodeScalars)?.value {
}
または、あなたが非常に妄想的になりたいなら、
if let char = first(singleChar.unicodeScalars) where char.isASCII() {
let ascii = char.value
}
Swift 4.1
https://oleb.net/blog/2017/11/Swift-4-strings/
let flags = "99_problems"
flags.unicodeScalars.map {
"\(String($0.value, radix: 16, uppercase: true))"
}
結果:
["39", "39", "5F", "70", "72", "6F", "62", "6C", "65", "6D", "73"]
あなたのやり方は正しいです。インデックス作成の冗長性が気に入らない場合は、Unicodeスカラーを循環させることでそれを回避できます。
var x : UInt32 = 0
let char = "a"
for sc in char.unicodeScalars {x = sc.value; break}
この場合、Unicodeスカラーは1つしかないため、実際にはbreak
を省略できます。
または、配列に変換してIntインデックスを使用します(必死の最後の手段):
let char = "a"
let x = Array(char.unicodeScalars)[0].value
UInt8にはUInt8(ascii:Unicode.Scalar)イニシャライザーもあります。
var singleChar = "a"
UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex])
var singchar = "a" as NSString
print(singchar.character(at: 0))
Swift 3.1
スイフト4+
ASCIIからASCII
let charVal = String(ch).unicodeScalars
var asciiVal = charVal[charVal.startIndex].value
ASCIIからChar
let char = Character(UnicodeScalar(asciiVal)!)
Swift 4
print("c".utf8["c".utf8.startIndex])
または
let cu = "c".utf8
print(cu[cu.startIndex])
どちらも99を出力します。ASCII文字。
Swift 5を使用すると、文字のASCII数値表現を取得するために、次のアプローチのいずれかを選択できます。
Character
のasciiValue
プロパティを使用するCharacter
には asciiValue
というプロパティがあります。 asciiValue
には次の宣言があります。
var asciiValue: UInt8? { get }
ASCIIこの文字のエンコード値(ASCII文字の場合)。
次のPlaygroundサンプルコードは、文字のASCIIエンコード値)を取得するためにasciiValue
を使用する方法を示しています。
let character: Character = "a"
print(character.asciiValue) //prints: Optional(97)
let string = "a"
print(string.first?.asciiValue) //prints: Optional(97)
let character: Character = "????"
print(character.asciiValue) //prints: nil
Character
のisASCII
プロパティとUnicode.Scalar
のvalue
プロパティ別の方法として、文字列の最初の文字がASCII文字(Character
の- isASCII
プロパティを使用)であることを確認できます。次に、最初のUnicodeスカラーの数値表現を取得します(Unicode.Scalar
の- value
プロパティ)。以下のPlaygroundサンプルコードは、処理方法を示しています。
let character: Character = "a"
if character.isASCII, let scalar = character.unicodeScalars.first {
print(scalar.value)
} else {
print("Not an ASCII character")
}
/*
prints: 97
*/
let string = "a"
if let character = string.first, character.isASCII, let scalar = character.unicodeScalars.first {
print(scalar.value)
} else {
print("Not an ASCII character")
}
/*
prints: 97
*/
let character: Character = "????"
if character.isASCII, let scalar = character.unicodeScalars.first {
print(scalar.value)
} else {
print("Not an ASCII character")
}
/*
prints: Not an ASCII character
*/