26

現在、以下のようなアルファベットの配列を作成できます

[[NSArray alloc]initWithObjects:@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T",@"U",@"V",@"W",@"X",@"Y",@"Z",nil];

それが利用可能であることを知る

[NSCharacterSet uppercaseLetterCharacterSet]

それから配列を作成する方法は?

4

9 に答える 9

53

次のコードは、特定の文字セットのすべての文字を含む配列を作成します。「基本多言語面」外の文字 (文字 > U+FFFF、例: U+10400 DESERET CAPITAL LETTER LONG I) にも機能します。

NSCharacterSet *charset = [NSCharacterSet uppercaseLetterCharacterSet];
NSMutableArray *array = [NSMutableArray array];
for (int plane = 0; plane <= 16; plane++) {
    if ([charset hasMemberInPlane:plane]) {
        UTF32Char c;
        for (c = plane << 16; c < (plane+1) << 16; c++) {
            if ([charset longCharacterIsMember:c]) {
                UTF32Char c1 = OSSwapHostToLittleInt32(c); // To make it byte-order safe
                NSString *s = [[NSString alloc] initWithBytes:&c1 length:4 encoding:NSUTF32LittleEndianStringEncoding];
                [array addObject:s];
            }
        }
    }
}

uppercaseLetterCharacterSetこれにより、1467 要素の配列が得られます。ただし、文字 > U+FFFF は UTF-16 サロゲート ペアとして に格納されることに注意してくださいNSString。たとえば、U+10400 は実際にはNSString2 文字の "\uD801\uDC00" として格納されます。

Swift 2コードは、この質問に対する他の回答で見つけることができます。これは、拡張メソッドとして記述されたSwift 3バージョンです。

extension CharacterSet {
    func allCharacters() -> [Character] {
        var result: [Character] = []
        for plane: UInt8 in 0...16 where self.hasMember(inPlane: plane) {
            for unicode in UInt32(plane) << 16 ..< UInt32(plane + 1) << 16 {
                if let uniChar = UnicodeScalar(unicode), self.contains(uniChar) {
                    result.append(Character(uniChar))
                }
            }
        }
        return result
    }
}

例:

let charset = CharacterSet.uppercaseLetters
let chars = charset.allCharacters()
print(chars.count) // 1521
print(chars) // ["A", "B", "C", ... "]

(結果を表示するために使用されるフォントには、一部の文字が存在しない場合があることに注意してください。)

于 2013-04-01T11:32:51.153 に答える
10

文字の範囲は限られており、有限 (かつ広すぎない) であるため、どの文字が特定の文字セットのメンバーであるかをテストすることができます (ブルート フォース):

// this doesn't seem to be available
#define UNICHAR_MAX (1ull << (CHAR_BIT * sizeof(unichar)))

NSData *data = [[NSCharacterSet uppercaseLetterCharacterSet] bitmapRepresentation];
uint8_t *ptr = [data bytes];
NSMutableArray *allCharsInSet = [NSMutableArray array];
// following from Apple's sample code
for (unichar i = 0; i < UNICHAR_MAX; i++) {
    if (ptr[i >> 3] & (1u << (i & 7))) {
        [allCharsInSet addObject:[NSString stringWithCharacters:&i length:1]];
    }
}

注意: unichar のサイズと bitmapRepresentation の追加セグメントの構造により、このソリューションは文字 <= 0xFFFF に対してのみ機能し、より高いプレーンには適していません。

于 2013-04-01T10:29:00.847 に答える
4

Martin R のアルゴリズムの Swift (v2.1) バージョンを作成しました。

let charset = NSCharacterSet.URLPathAllowedCharacterSet();

for var plane : UInt8 in 0...16 {
    if charset.hasMemberInPlane( plane ) {
        var c : UTF32Char;

        for var c : UInt32 = UInt32( plane ) << 16; c < (UInt32(plane)+1) << 16; c++ {
            if charset.longCharacterIsMember(c) {
                var c1 = c.littleEndian // To make it byte-order safe
                let s = NSString(bytes: &c1, length: 4, encoding: NSUTF32LittleEndianStringEncoding);
                NSLog("Char: \(s)");
            }
        }
    }
}
于 2015-11-25T13:24:30.177 に答える
2

これは、Swift の Swift をもう少し使用して行われます。

let characters = NSCharacterSet.uppercaseLetterCharacterSet()
var array      = [String]()

for plane: UInt8 in 0...16 where characters.hasMemberInPlane(plane) {

  for character: UTF32Char in UInt32(plane) << 16..<(UInt32(plane) + 1) << 16 where characters.longCharacterIsMember(character) {

    var endian = character.littleEndian
    let string = NSString(bytes: &endian, length: 4, encoding: NSUTF32LittleEndianStringEncoding) as! String

    array.append(string)

  }

}

print(array)
于 2016-01-18T15:05:48.710 に答える
0

ラテン アルファベットの A ~ Z のみ (ギリシャ語、分音記号、または男が要求したものではないものはありません):

for plane: UInt8 in 0...16 where characters.hasMemberInPlane(plane) {
    i = 0
    for character: UTF32Char in UInt32(plane) << 16...(UInt32(plane) + 1) << 16 where characters.longCharacterIsMember(character) {
        var endian = character.littleEndian
        let string = NSString(bytes: &endian, length: 4, encoding: NSUTF32LittleEndianStringEncoding) as! String
        array.append(string)
        if(array.count == 26) {
            break
        }
    }
    if(array.count == 26) {
        break
    }
}
于 2016-08-12T18:20:18.413 に答える