gpt4 book ai didi

ios - Objective-C 中的 .hash 等同于 Swift 中的 .hashValue 吗?

转载 作者:行者123 更新时间:2023-11-29 12:01:47 24 4
gpt4 key购买 nike

Objective-C 中的 .hash 等同于 Swift 中的 .hashValue 吗?

如果不是,Objective-C 中的 .hashValue 是什么?

这与我在这里遇到的一个问题有关(我正在将 Swift 库转换为 Objective-C 作为练习):

+ (NSDateFormatter *) formatter : (NSDateFormatterStyle *) dateStyle : (NSDateFormatterStyle *) timeStyle : (BOOL) doesRelativeDateFormatting : (NSTimeZone *) timeZone : (NSLocale *) locale {
timeZone = [NSTimeZone localTimeZone];
locale = [NSLocale currentLocale];
NSString *hashKey = [NSString stringWithFormat:@"%@%@%@%@%@", dateStyle.hash, timeStyle.hash, doesRelativeDateFormatting.hash, timeZone.hash, locale.hash];
NSMutableDictionary *formatters = [NSDate sharedDateFormatters];
NSDateFormatter *cachedDateFormatter = formatters[hashKey];
if (cachedDateFormatter != nil) {
return cachedDateFormatter;
}
else {
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateStyle = *(dateStyle);
formatter.timeStyle = *(timeStyle);
formatter.doesRelativeDateFormatting = doesRelativeDateFormatting;
formatter.timeZone = timeZone;
formatter.locale = locale;
formatters[hashKey] = formatter;
return formatter;
}
}

在这一行告诉我:NSString *hashKey = [NSString stringWithFormat:@"%@%@%@%@%@", dateStyle.hash, timeStyle.hash, doesRelativeDateFormatting.hash, timeZone.hash, locale.hash];

成员引用基类型“NSDateFormatterStyle ”(又名“枚举 NSDateFormatterStyle”)不是结构或联合

原始 Swift 代码:

private class func formatter(dateStyle dateStyle: NSDateFormatterStyle, timeStyle: NSDateFormatterStyle, doesRelativeDateFormatting: Bool, timeZone: NSTimeZone = NSTimeZone.localTimeZone(), locale: NSLocale = NSLocale.currentLocale()) -> NSDateFormatter {
var formatters = NSDate.sharedDateFormatters()
let hashKey = "\(dateStyle.hashValue)\(timeStyle.hashValue)\(doesRelativeDateFormatting.hashValue)\(timeZone.hashValue)\(locale.hashValue)"
if let cachedDateFormatter = formatters[hashKey] {
return cachedDateFormatter
} else {
let formatter = NSDateFormatter()
formatter.dateStyle = dateStyle
formatter.timeStyle = timeStyle
formatter.doesRelativeDateFormatting = doesRelativeDateFormatting
formatter.timeZone = timeZone
formatter.locale = locale
formatters[hashKey] = formatter
return formatter
}
}

最佳答案

这里有几个问题。

  1. NSDateFormatterStyle 是一个枚举。您不应为这些参数使用指针。
  2. hash 只能通过 NSObject 获得。因此,您不能在 Objective-C 中对原始类型调用 hash
  3. hash 返回 NSUInteger 但您的 stringWithFormat 使用的是 %@ 说明符。那行不通的。 %@ 仅用于对象指针。
  4. 您在方法名称中使用匿名参数是不规范的。

您的代码需要是这样的:

+ (NSDateFormatter *)formatter:(NSDateFormatterStyle)dateStyle timeStyle:(NSDateFormatterStyle)timeStyle relativeDateFormatting:(BOOL)doesRelativeDateFormatting timeZone:(NSTimeZone *)timeZone locale:(NSLocale *)locale {
NSString *hashKey = [NSString stringWithFormat:@"%lu%lu%lu%lu%lu", (unsigned long)dateStyle, (unsigned long)timeStyle, (unsigned long)doesRelativeDateFormatting, (unsigned long)timeZone.hash, (unsigned long)locale.hash];
NSMutableDictionary *formatters = [NSDate sharedDateFormatters];
NSDateFormatter *cachedDateFormatter = formatters[hashKey];
if (cachedDateFormatter != nil) {
return cachedDateFormatter;
}
else {
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateStyle = dateStyle;
formatter.timeStyle = timeStyle;
formatter.doesRelativeDateFormatting = doesRelativeDateFormatting;
formatter.timeZone = timeZone;
formatter.locale = locale;
formatters[hashKey] = formatter;
return formatter;
}
}

关于 hashhashValue 的问题。它们有点像。尽管 Swift 通过 Hashable 协议(protocol)提供了 hashValue,并且它得到了 Swift 的所有内置类型的支持,例如 IntString

hashNSObject 的一个方法。它可以在 Objective-C 或 Swift 中使用,但只能用于扩展 NSObject 的类。它不能与原始类型一起使用。

关于ios - Objective-C 中的 .hash 等同于 Swift 中的 .hashValue 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36666949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com