objective-c - 如何将此 Swift 语法转换为 Objective-C?

标签 objective-c swift

作为练习,我正在将 Swift 库转换为 Objective-C。

如何将其转换为 Objective-C?

let formatter = NSDate.formatter(format: dateFormat)

我试过:

NSDateFormatter *formatter = [NSDate formatterWithFormat : dateFormat];

也试过这个:

NSDateFormatter *formatter = [NSDate formatterWithFormat : dateFormat : [NSTimeZone localTimeZone] : [NSLocale currentLocale]];

也试过这个:

NSDateFormatter *formatter = [NSDate formatter : dateFormat : [NSTimeZone localTimeZone] : [NSLocale currentLocale]];

错误:不知道选择器“formatterWithFormat:”或“formatter::::”的类方法

更多上下文:

+ (NSDateFormatter *) formatter : (NSString *) format  : (NSTimeZone*) timeZone  : (NSLocale *) locale {
    format = DefaultFormat;
    timeZone = [NSTimeZone localTimeZone];
    locale = [NSLocale currentLocale];
    NSString *hashKey = [NSString stringWithFormat:@"%lu%lu%lu", (unsigned long)format.hash, (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.dateFormat = format;
        formatter.timeZone = timeZone;
        formatter.locale = locale;
        formatters[hashKey] = formatter;
        return formatter;
    }
}

中间有一些随机文本,这样我就可以添加更多代码...

+ (NSDateFormatter *)formatter:(NSDateFormatterStyle)dateStyle timeStyle:(NSDateFormatterStyle)timeStyle relativeDateFormatting:(BOOL)doesRelativeDateFormatting timeZone:(NSTimeZone *)timeZone locale:(NSLocale *)locale {
    timeZone = [NSTimeZone localTimeZone];
    locale = [NSLocale currentLocale];
    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;
    }
}

原始 Swift 代码:

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

中间有一些随机文本,这样我就可以添加更多代码...

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
        }
    }

最佳答案

您的语法转换在句法上是正确的。

但是,NSDate 不提供称为formatterWithFormat:formatter 的静态方法;您正在翻译的代码似乎有一个扩展 方法。您需要找到该方法,然后翻译它。

注意:我强烈建议反对将其作为NSDate 的扩展,因为它属于类层次结构的NSDateFormatter 一侧。

关于objective-c - 如何将此 Swift 语法转换为 Objective-C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36667276/

相关文章:

objective-c - OBJ-C : NSStrings - stringByAppendingString method

objective-c - 使一系列按钮的响应都不同

swift - 为什么 CGFloat.zero 存在?

ios - 使用自动布局约束对 viewController 过渡进行动画处理 (Swift)

ios - 如何在 Storyboard中连接下一个 View Controller 后推送 View Controller

objective-c - 是什么原因导致 "Virtual Memory exhausted"错误?

c++ - EXC_BAD_ACCESS 从 NSTimer 调用 c++ 类方法

iphone - 如何以编程方式暂停 NSTimer?

ios - 在 Swift 中对 UITabBarController 进行 segue 后如何摆脱 UINavigationController?

swift - 在应用程序中显示一次 UIAlert