swift - 複数 - whitespacesandnewlines



重複しない2つのCharacterSetの共通部分が空でないのはなぜですか? (1)

私はユーザー入力文字列に10進数以外の文字が含まれていないかどうかを確認するためにCharacterSetを使用しようとしていました。 私はCharacterSet.decimalDigitsを使用し、それとユーザーの入力との交点を取っています。 この交差点が空の場合、おそらくユーザーが有効な入力を入力しなかったことを意味します。 しかし交差点は空ではありません。

let digits = CharacterSet.decimalDigits
let letters = CharacterSet(charactersIn: "abcd") // never prints

let intersection = digits.intersection(letters)
for c in "abcd".characters {
    if intersection.contains(UnicodeScalar(String(c))!) {
        print("contains \(c)") // never prints
    }
}

for i in 0...9 {
    if intersection.contains(UnicodeScalar(String(i))!) {
        print("contains \(i)")
    }
}

print("intersection is empty: \(intersection.isEmpty)") // prints false

私はメンバーシップをテストするためにすべてのユニコードスカラーをループしてみましたが、それは何も印刷しません。

for i in 0x0000...0xFFFF {
    guard let c = UnicodeScalar(i) else {
        continue
    }
    if intersection.contains(c) {
        print("contains \(c)")
    }
}

セットが空でないのはなぜですか?

Note let digits = CharacterSet(charactersIn: "1234567890")すると、期待どおりに動作します。 decimalDigitsは0-9以上のものが含まれていますが、交差点はまだ空であるはずです。


私はCharacterSetバグを閲覧し、交差点の周りにisEmpty間違って報告していisEmptyので、再現性の良い例であるためバグを報告してください。

その間に、入力に.decimalDigits文字.decimalDigits文字が含まれているかどうかを確認するためにこれを試すことができます.decimalDigits

let letterInput = CharacterSet(charactersIn: "abcd")
digits.isSubset(of: letterInput.inverted)
// -> true

let letterAndDigitInput = CharacterSet(charactersIn: "abcd 1234")
digits.isSubset(of: letterAndDigitInput.inverted)
// -> false

let digitInput = CharacterSet(charactersIn: "1234")
digits.isSubset(of: digitInput.inverted)
// -> false