为什么苹果使用 NSString 对象作为参数而不是枚举



例如,为什么要使用这个:

NSLocale *l = [[NSLocale alloc] initWithLocaleIdentifier@"en_US"];

而不是这样的东西:

NSLocale *l = [[NSLocale alloc] initWithLocaleIdentifier:NSLocaleIdentifierUS];

它似乎可以防止很多错误,因为在 Xcode 中键入 NSString 时,没有自动更正,而 Xcode 会自动更正/自动填充枚举。此外,我想不出在枚举或常量上使用 NSStrings 的理由。例如,随着新版本SDK的发布,Apple可以添加新的标识符,但他们也可以使用枚举来执行此操作。枚举相对于字符串常量的另一个好处是可以更轻松地比较枚举:

if(userIdentifier == NSLocaleIdentifierUS) {
    //English!
}

此外,对于其他方法,Apple 使用枚举或特定对象作为参数:

NSData *data = [aString dataUsingEncoding:NSASCIIStringEncoding];

如果他们使用 localeIdentifier 的字符串,为什么不这样做:

NSData *data = [aString dataUsingEncoding:@"ascii"];

似乎他们只是不一致。

评论中对这个问题有几个答案:

  1. 数百个区域设置,以及已经存在的许多变体(例如,有"en_US"和"en_US_POSIX",因此创建这么多枚举是不切实际的。
  2. 从 Web 服务读取数据时,
  3. 使用的格式为"lang_COUNTRY",因此使用相同的格式是有意义的,以避免每次从 Web 下载区域设置数据时都分析 Web 数据。
  4. 字符串是对象,因此可以轻松地将它们存储在集合中,而无需像枚举那样将它们包装在 NSNumber 对象中。

最新更新