web-dev-qa-db-ja.com

Swiftで単一の文字列からASCII値に変換する最も簡単な方法は何ですか?

私はSwiftで単一の文字列のASCII値を取得したいだけです。これは私が現在それをやっている方法です:

var singleChar = "a"
println(singleChar.unicodeScalars[singleChar.unicodeScalars.startIndex].value) //prints: 97

これはとてもいです。もっと簡単な方法が必要です。

60
DavidNorman

編集/更新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
91
Leo Dabus
UnicodeScalar("1")!.value // returns 49

Swift 3.1

12
Joe

Xcode 7.1では、Swift 2.1

var singleChar = "a"

singleChar.unicodeScalars.first?.value
10
wakeupsumo

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
10
timgcarlson

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
4
aios

私の実装は次のとおりです。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互換です。

3
Sakiboy

これを行う少し短い方法は次のとおりです。

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
}
3

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

2
rustyMagnet

あなたのやり方は正しいです。インデックス作成の冗長性が気に入らない場合は、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
2
matt

UInt8にはUInt8(ascii:Unicode.Scalar)イニシャライザーもあります。

var singleChar = "a"
UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex])
1
Anders
var singchar = "a" as NSString

print(singchar.character(at: 0))

Swift 3.1

1
Shauket Sheikh

スイフト4+

ASCIIからASCII

let charVal = String(ch).unicodeScalars
var asciiVal = charVal[charVal.startIndex].value

ASCIIからChar

let char = Character(UnicodeScalar(asciiVal)!)
0
Mohit Kumar

Swift 4

print("c".utf8["c".utf8.startIndex])

または

let cu = "c".utf8
print(cu[cu.startIndex])

どちらも99を出力します。ASCII文字。

0
PJ_Finnegan

Swift 5を使用すると、文字のASCII数値表現を取得するために、次のアプローチのいずれかを選択できます。


#1。 CharacterasciiValueプロパティを使用する

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

#2。 CharacterisASCIIプロパティとUnicode.Scalarvalueプロパティ

別の方法として、文字列の最初の文字が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
 */
0
Imanou Petit