为了账号安全,请及时绑定邮箱和手机立即绑定

来自NSCharacterSet的NSArray

来自NSCharacterSet的NSArray

目前,我能够制作如下的字母数组[[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]如何制作一个数组呢?
查看完整描述

3 回答

?
森栏

TA贡献1810条经验 获得超5个赞

以下代码创建一个包含给定字符集的所有字符的数组。它也适用于“基本多语言平面”之外的字符(字符> 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实际上存储NSString为2个字符“ \ 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", ... "]

(请注意,某些字符可能不会显示在用于显示结果的字体中。)


查看完整回答
反对 回复 2019-10-11
  • 3 回答
  • 0 关注
  • 508 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信