Bạn có thể lọc UnicodeScalarView của chuỗi bằng cách sử dụng toán tử so khớp mẫu cho các phạm vi, chuyển một UnicodeScalar ClosedRange từ 0 đến 9 và khởi tạo một Chuỗi mới với UnicodeScalarView kết quả:
extension String {
private static var digits = UnicodeScalar("0")..."9"
var digits: String {
return String(unicodeScalars.filter(String.digits.contains))
}
}
"abc12345".digits
chỉnh sửa / cập nhật:
Swift 4.2
extension RangeReplaceableCollection where Self: StringProtocol {
var digits: Self {
return filter(("0"..."9").contains)
}
}
hoặc như một phương pháp đột biến
extension RangeReplaceableCollection where Self: StringProtocol {
mutating func removeAllNonNumeric() {
removeAll { !("0"..."9" ~= $0) }
}
}
Swift 5.2 • Xcode 11.4 trở lên
Trong Swift5, chúng ta có thể sử dụng một thuộc tính Character mới được gọi là isWholeNumber
:
extension RangeReplaceableCollection where Self: StringProtocol {
var digits: Self { filter(\.isWholeNumber) }
}
extension RangeReplaceableCollection where Self: StringProtocol {
mutating func removeAllNonNumeric() {
removeAll { !$0.isWholeNumber }
}
}
Để cho phép một khoảng thời gian, chúng tôi cũng có thể mở rộng Ký tự và tạo một thuộc tính được tính toán:
extension Character {
var isDecimalOrPeriod: Bool { "0"..."9" ~= self || self == "." }
}
extension RangeReplaceableCollection where Self: StringProtocol {
var digitsAndPeriods: Self { filter(\.isDecimalOrPeriod) }
}
Thử nghiệm sân chơi:
"abc12345".digits
var str = "123abc0"
str.removeAllNonNumeric()
print(str)
"Testing0123456789.".digitsAndPeriods
inverted
trên bộ ký tự trong ví dụ Swift 3 không?