【问题标题】:NSUUID lowercase charactersNSUUID 小写字符
【发布时间】:2026-02-03 06:15:01
【问题描述】:

我在我的应用中使用NSUUID 作为唯一ID,如下所示:

[[NSUUID UUID] UUIDString]

正如预期的结果,我得到了一个像这样的 id:102A21AD-7216-4517-8A79-39776B767E72

出于后端原因,我需要 uuid 中的字母为小写。我试着打电话

[[NSUUID UUID] UUIDString].lowercaseString 

但是返回的字符串是空的。

我真的必须遍历字符串中的所有字符并将适当的字符转换为小写吗?如果是这样,有人对最有效的方法有什么建议吗?

编辑:

我试图实现这一点的方法是继承 NSUUID,然后覆盖

-(NSString*) UUIDString; 

方法。

我的实现是

-(NSString*) UUIDString{
    return [super UUIDString].lowercaseString;
}

接受的答案解释了为什么这不起作用。

【问题讨论】:

  • 显示更多关于你正在做什么的代码。你如何检查结果?
  • 完美运行:NSLog(@"%@", [[[NSUUID UUID] UUIDString] lowercaseString]);

标签: objective-c cocoa nsstring nsuuid


【解决方案1】:

根据您对问题的编辑,需要进行一些调查...

看起来NSUUID 的行为类似于一个类集群,如果不实现它的关键方法并自己提供 UUID 生成功能,就不能对其进行子类化。如果你对它进行子类化,你会得到一个父类,其UUIDString 是空字符串。虽然类的标准 init 会返回一个 __NSConcreteUUID 的实例,但它的 UUIDString 更有用!

如果上述内容令人困惑,则以下部分实现显示了一种方法:

@interface LowerUUID : NSUUID
@end

@implementation LowerUUID
{
   NSUUID *real;
}

- (id) init
{
   self = [super init];
   if (self)
      real = NSUUID.new;
   return self;
}

- (NSString *) UUIDString
{
   NSString *original = [real UUIDString];
   NSString *lower = original.lowercaseString;
   return lower;
}

@end

为了完整起见,您还需要提供其他方法的实现。

对于这个特定的课程,您不太可能会觉得这是值得的,但对于像 NSMutableArray 这样的课程集群,它确实有意义。

您可以向 Apple 提交错误报告,说明文档没有说明您不能简单地继承 NSUUID

【讨论】:

  • 我的原始答案已被删除,但这是一个很好的解释,谢谢。
  • @LOP_Luke - 重新措辞第一行,以便在您的回答成为对问题的编辑后再次有意义。
【解决方案2】:

这对我有用:

NSString *lower = [[[NSUUID UUID] UUIDString] lowercaseString];

【讨论】:

    【解决方案3】:

    我试过了,效果很好:

    NSString *str = [[NSUUID UUID] UUIDString];
    NSLog(@"1: %@", str);
    NSLog(@"2: %@", str.lowercaseString);
    

    【讨论】: