正如提到的这个帖子,之前的Xcode 6 Beta 4的,可以使用c.isDigit(),并c.isAlpha()找到,如果c : Character是一个数字或字母.帖子提到这被删除,因为它只对ASCII字符有效.
我的问题是,什么是替代品?如果没有使用用于字母数字选项的switch语句设置函数,我该如何测试其数字上的字符?
Mar*_*n R 64
"问题"是Swift字符不直接对应于Unicode代码点,而是表示"扩展字形集群",它可以包含多个Unicode标量.例如
let c : Character = "" // REGIONAL INDICATOR SYMBOL LETTERS US
Run Code Online (Sandbox Code Playgroud)
实际上是两个 Unicode标量的序列.
如果我们忽略这个事实,那么你可以检索字符的初始 Unicode标量(比较如何获得字符的Unicode代码点?)并测试其在字符集中的成员资格:
let c : Character = "5"
let s = String(c).unicodeScalars
let uni = s[s.startIndex]
let digits = NSCharacterSet.decimalDigitCharacterSet()
let isADigit = digits.longCharacterIsMember(uni.value)
Run Code Online (Sandbox Code Playgroud)
这对于字符"0"..."9"返回"true",但实际上对于"十进制数字类别"的所有 Unicode标量,例如:
let c1 : Character = "?" // BENGALI DIGIT NINE U+09EF
let c2 : Character = "" // MATHEMATICAL DOUBLE-STRUCK DIGIT ONE U+1D7D9
Run Code Online (Sandbox Code Playgroud)
如果你只关心(ASCII)数字"0"..."9",那么最简单的方法可能是:
if c >= "0" && c <= "9" { }
Run Code Online (Sandbox Code Playgroud)
或者,使用范围:
if "0"..."9" ~= c { }
Run Code Online (Sandbox Code Playgroud)
小智 8
Swift 3似乎更容易一些:
let str = "abcdef12345"
let digitSet = CharacterSet.decimalDigits
for ch in str.unicodeScalars {
if digitSet.contains(ch) {
// is digit!
}
}
Run Code Online (Sandbox Code Playgroud)
使用Swift 5,您可以根据需要选择以下方式之一来解决问题。
Character的isNumber属性角色具有称为的属性isNumber。isNumber具有以下声明:
var isNumber: Bool { get }
Run Code Online (Sandbox Code Playgroud)
一个布尔值,指示此字符是否代表数字。
下面的Playground示例代码显示了如何使用以下方法检查字符是否代表数字isNumber:
let character: Character = "9"
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "½"
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1?"
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1??"
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = ""
print(character.isNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "F"
print(character.isNumber) // false
Run Code Online (Sandbox Code Playgroud)
Character的isWholeNumber属性如果要检查字符是否代表整数,可以使用Character的isWholeNumber属性:
let character: Character = "9"
print(character.isWholeNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "½"
print(character.isWholeNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
print(character.isWholeNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1?"
print(character.isWholeNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1??"
print(character.isWholeNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
print(character.isWholeNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = ""
print(character.isWholeNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "F"
print(character.isWholeNumber) // false
Run Code Online (Sandbox Code Playgroud)
Unicode.Scalar.Properties的generalCategory属性和Unicode.GeneralCategory.decimalNumber下图显示了样品游乐场代码如何检查如果一个字符的第一个Unicode标是使用十进制数generalCategory和Unicode.GeneralCategory.decimalNumber:
let character: Character = "9"
let scalar = character.unicodeScalars.first! // DIGIT NINE
print(scalar.properties.generalCategory == .decimalNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "½"
let scalar = character.unicodeScalars.first! // VULGAR FRACTION ONE HALF
print(scalar.properties.generalCategory == .decimalNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
let scalar = character.unicodeScalars.first! // CIRCLED DIGIT FOUR
print(scalar.properties.generalCategory == .decimalNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1?"
let scalar = character.unicodeScalars.first! // DIGIT ONE
print(scalar.properties.generalCategory == .decimalNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1??"
let scalar = character.unicodeScalars.first! // DIGIT ONE
print(scalar.properties.generalCategory == .decimalNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
let scalar = character.unicodeScalars.first! // BENGALI DIGIT NINE
print(scalar.properties.generalCategory == .decimalNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = ""
let scalar = character.unicodeScalars.first! // MATHEMATICAL DOUBLE-STRUCK DIGIT ONE
print(scalar.properties.generalCategory == .decimalNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "F"
let scalar = character.unicodeScalars.first! // LATIN CAPITAL LETTER F
print(scalar.properties.generalCategory == .decimalNumber) // false
Run Code Online (Sandbox Code Playgroud)
Unicode.Scalar.Properties的generalCategory属性和Unicode.GeneralCategory.otherNumber同样,你可以检查一个字符对应的第一个Unicode标到类别Other_Number Unicode标准使用generalCategory和Unicode.GeneralCategory.otherNumber:
let character: Character = "9"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "½"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // true
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1?"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1??"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = ""
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // false
Run Code Online (Sandbox Code Playgroud)
let character: Character = "F"
let scalar = character.unicodeScalars.first!
print(scalar.properties.generalCategory == .otherNumber) // false
Run Code Online (Sandbox Code Playgroud)
CharacterSet的decimalDigits属性或者,可以导入Foundation并检查是否CharacterSet.decimalDigits包含字符的第一个Unicode标量:
import Foundation
let character: Character = "9"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // true
Run Code Online (Sandbox Code Playgroud)
import Foundation
let character: Character = "½"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // false
Run Code Online (Sandbox Code Playgroud)
import Foundation
let character: Character = "?"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // false
Run Code Online (Sandbox Code Playgroud)
import Foundation
let character: Character = "1?"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // true
Run Code Online (Sandbox Code Playgroud)
import Foundation
let character: Character = "1??"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // true
Run Code Online (Sandbox Code Playgroud)
import Foundation
let character: Character = "?"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // true
Run Code Online (Sandbox Code Playgroud)
import Foundation
let character: Character = ""
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // true
Run Code Online (Sandbox Code Playgroud)
import Foundation
let character: Character = "F"
let scalar = character.unicodeScalars.first!
print(CharacterSet.decimalDigits.contains(scalar)) // false
Run Code Online (Sandbox Code Playgroud)
Unicode.Scalar.Properties的numericTypeApple文档指出numericType:
对于表示数字的标量,numericType是标量的数字类型。对于所有其他标量,此属性为
nil。
以下示例代码示出了可能的数值类型(decimal,digit或numeric对于给定字符的第一个标量):
let character: Character = "9"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.decimal)
Run Code Online (Sandbox Code Playgroud)
let character: Character = "½"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.numeric)
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.digit)
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1?"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.decimal)
Run Code Online (Sandbox Code Playgroud)
let character: Character = "1??"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.decimal)
Run Code Online (Sandbox Code Playgroud)
let character: Character = "?"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.decimal)
Run Code Online (Sandbox Code Playgroud)
let character: Character = ""
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // Optional(Swift.Unicode.NumericType.decimal)
Run Code Online (Sandbox Code Playgroud)
let character: Character = "F"
let scalar = character.unicodeScalars.first!
print(scalar.properties.numericType) // nil
Run Code Online (Sandbox Code Playgroud)