Bearbeiten / Aktualisieren von Swift 5.2 oder höher
extension StringProtocol {
var asciiValues: [UInt8] { compactMap(\.asciiValue) }
}
"abc".asciiValues
In Swift 5 können Sie die neuen Zeicheneigenschaften isASCII und asciiValue verwenden
Character("a").isASCII
Character("a").asciiValue
Character("á").isASCII
Character("á").asciiValue
Alte Antwort
Sie können eine Erweiterung erstellen:
Swift 4.2 oder höher
extension Character {
var isAscii: Bool {
return unicodeScalars.allSatisfy { $0.isASCII }
}
var ascii: UInt32? {
return isAscii ? unicodeScalars.first?.value : nil
}
}
extension StringProtocol {
var asciiValues: [UInt32] {
return compactMap { $0.ascii }
}
}
Character("a").isAscii
Character("a").ascii
Character("á").isAscii
Character("á").ascii
"abc".asciiValues
"abc".asciiValues[0]
"abc".asciiValues[1]
"abc".asciiValues[2]
guard let value = UnicodeScalar("1")?.value else { return }
.if let
oderguard let
Aussagen existieren auch aus einem Grund. Ich bin überzeugt, dass Sie, wann immer möglich, auf Nummer sicher gehen sollten. Und dass wir als erfahrener Entwickler allen Neulingen hier bei stackoverflow einen guten Codierungsstil und Best Practices bieten sollten. Es war nicht als Straftat gedacht.Jetzt in Xcode 7.1 und Swift 2.1
var singleChar = "a" singleChar.unicodeScalars.first?.value
quelle
Sie können den CharakterAtIndex von NSString verwenden , um dies zu erreichen ...
var singleCharString = "a" as NSString var singleCharValue = singleCharString.characterAtIndex(0) println("The value of \(singleCharString) is \(singleCharValue)") // The value of a is 97
quelle
error: value of type 'String' has no member 'character'
. aber wenn "a" als NSString verwendet wird, funktioniert es :)Swift 4.2
Der einfachste Weg, um ASCII-Werte aus einer Swift-Zeichenfolge abzurufen, ist unten aufgeführt
let str = "Swift string" for ascii in str.utf8 { print(ascii) }
Ausgabe:
83 119 105 102 116 32 115 116 114 105 110 103
quelle
let str = "😀"
for ascii in str.utf8 {
print(ascii)
}
// 240, 159, 152, 128`Die Art und Weise, wie Sie es tun, ist richtig. Wenn Ihnen die Ausführlichkeit der Indizierung nicht gefällt, können Sie sie vermeiden, indem Sie durch die Unicode-Skalare blättern:
var x : UInt32 = 0 let char = "a" for sc in char.unicodeScalars {x = sc.value; break}
break
In diesem Fall können Sie das natürlich weglassen , da es nur einen Unicode-Skalar gibt.Oder konvertieren Sie in ein Array und verwenden Sie die Int-Indizierung (das letzte Mittel der Verzweifelten):
let char = "a" let x = Array(char.unicodeScalars)[0].value
quelle
Ein etwas kürzerer Weg, dies zu tun, könnte sein:
Wie bei der tiefgestellten Version stürzt dies ab, wenn Ihre Zeichenfolge tatsächlich leer ist. Wenn Sie sich also nicht 100% sicher sind, verwenden Sie die Option:
if let ascii = first(singleChar.unicodeScalars)?.value { }
Oder wenn Sie extra-paranoid sein wollen,
if let char = first(singleChar.unicodeScalars) where char.isASCII() { let ascii = char.value }
quelle
Hier ist meine Implementierung, die ein Array der ASCII-Werte zurückgibt.
extension String { func asciiValueOfString() -> [UInt32] { var retVal = [UInt32]() for val in self.unicodeScalars where val.isASCII() { retVal.append(UInt32(val)) } return retVal } }
Hinweis: Ja, es ist Swift 2-kompatibel.
quelle
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))" }
Ergebnis:
["39", "39", "5F", "70", "72", "6F", "62", "6C", "65", "6D", "73"]
quelle
let flags = "😀"
flags.unicodeScalars.map {
"\(String($0.value, radix: 16, uppercase: true))"
}
// "1F600"var singchar = "a" as NSString print(singchar.character(at: 0))
Swift 3.1
quelle
Es gibt auch den UInt8-Initialisierer (ascii: Unicode.Scalar) auf UInt8.
var singleChar = "a" UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex])
quelle
var singleChar = "😀"
UInt8(ascii: singleChar.unicodeScalars[singleChar.startIndex])
// Schwerwiegender Fehler: Codepunktwert passt nicht in ASCII: Datei /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1200.2.10.322/swift/stdlib/public/core/UnicodeScalar .swift, Linie 354`Swift 4
print("c".utf8["c".utf8.startIndex])
oder
let cu = "c".utf8 print(cu[cu.startIndex])
Beide drucken 99. Funktioniert für jedes ASCII-Zeichen.
quelle
Swift 4+
Char zu ASCII
let charVal = String(ch).unicodeScalars var asciiVal = charVal[charVal.startIndex].value
ASCII zu Char
let char = Character(UnicodeScalar(asciiVal)!)
quelle
let charVal = String("😀").unicodeScalars
charVal[charVal.startIndex].value
// 128512Mit Swift 5 können Sie einen der folgenden Ansätze auswählen, um die numerische ASCII-Darstellung eines Zeichens zu erhalten.
# 1. Verwenden
Character
derasciiValue
Eigenschaft vonCharacter
hat eine Eigenschaft namensasciiValue
.asciiValue
hat die folgende Erklärung:var asciiValue: UInt8? { get }
Die folgenden Playground-Beispielcodes zeigen, wie
asciiValue
Sie den ASCII-Codierungswert eines Zeichens ermitteln: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. Verwenden von
Character
'sisASCII
Eigenschaft undUnicode.Scalar
' svalue
EigenschaftAlternativ können Sie überprüfen, ob das erste Zeichen einer Zeichenfolge ein ASCII-Zeichen ist (mithilfe
Character
derisASCII
Eigenschaft '), und dann die numerische Darstellung des ersten Unicode-Skalars (mithilfeUnicode.Scalar
dervalue
Eigenschaft ') abrufen . Der folgende Beispielcode für den Spielplatz zeigt, wie Sie vorgehen müssen: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 */
quelle