如何将具有关联值的参数化枚举/枚举从 Swift 转换为 Objective-C?
How do I convert a parameterised enum/ enum with associated values from Swift to Objective-C?
注意: 作为练习,我将 Swift 代码转换为 Objective-C.
CODE: 原始 Swift 我转换的代码:
case .ISO8601(let isoFormat):
let dateFormat = (isoFormat != nil) ? isoFormat! : ISO8601Format(dateString: string as String)
let formatter = NSDate.formatter(format: dateFormat.rawValue)
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
formatter.timeZone = NSTimeZone.localTimeZone()
formatter.dateFormat = dateFormat.rawValue
if let date = formatter.dateFromString(string as String) {
self.init(timeInterval:0, sinceDate:date)
} else {
self.init()
}
我尝试了什么: 我尝试的 Objective-C 转换:
else if([format.dateFormatType compare: ISO8601DateFormatType] == NSOrderedSame) {
NSString *isoFormat = // WHAT DO TO HERE ?;
NSString *dateFormat = (isoFormat != nil) ? isoFormat : ISO8601DateFormatType;
NSDateFormatter *formatter = [NSDate formatterWithFormat: dateFormat andTimeZone: [NSTimeZone localTimeZone ] andLocale: [NSLocale currentLocale]];
formatter.locale = [NSLocale localeWithLocaleIdentifier: (@"en_US_POSIX")];
NSLog([NSString stringWithFormat:@"%@", dateFormat]);
// dateFormat = ISO8601
NSDate *date = [formatter dateFromString:(string)];
//
// ISSUE IS HERRRREEEE ^
//
NSLog([NSString stringWithFormat:@"%@", date]);
// date = nil
if (date != nil){
return [self initWithTimeInterval: 0 sinceDate: date];
}
else {
return [self init];
}
}
我采用的方法是使用单独的 class 来重现具有关联值的 swift 枚举的行为(这最初是一个具有关联值的大型 swift 枚举):
DateFormat.m
#import "DateFormat.h"
@implementation DateFormat
NSString * const ISO8601DateFormatType = @"ISO8601";
NSString * const DotNetDateFormatType = @"DotNet";
NSString * const RSSDateFormatType = @"EEE, d MMM yyyy HH:mm:ss ZZZ";
NSString * const AltRSSDateFormatType = @"d MMM yyyy HH:mm:ss ZZZ";
NSString * const CustomDateFormatType = @"Custom";
NSString * const ISOFormatYear = @"yyyy";
NSString * const ISOFormatYearMonth = @"yyyy-MM"; // 1997-07
NSString * const ISOFormatDate = @"yyyy-MM-dd"; // 1997-07-16
NSString * const ISOFormatDateTime = @"yyyy-MM-dd'T'HH:mmZ"; // 1997-07-16T19:20+01:00
NSString * const ISOFormatDateTimeSec = @"yyyy-MM-dd'T'HH:mm:ssZ"; // 1997-07-16T19:20:30+01:00
NSString * const ISOFormatDateTimeMilliSec = @"yyyy-MM-dd'T'HH:mm:ss.SSSZ"; // 1997-07-16T19:20:30.45+01:00
- (instancetype) initWithType: (NSString *) formatType details: (NSString *) details {
if(self = [super init]) {
_dateFormatType = formatType;
_formatDetails = details;
}
return self;
}
+ (instancetype) ISODateFormat: (NSString *) isoFormat
{
return [[DateFormat alloc] initWithType: ISO8601DateFormatType details: isoFormat];
}
+ (instancetype) DotNetDateFormat
{
return [[DateFormat alloc] initWithType: DotNetDateFormatType details: nil];
}
+ (instancetype) RSSDateFormat
{
return [[DateFormat alloc] initWithType: RSSDateFormatType details: nil];
}
+ (instancetype) AltRSSDateFormat
{
return [[DateFormat alloc] initWithType: AltRSSDateFormatType details: nil];
}
+ (instancetype) CustomDateFormat: (NSString *) formatString
{
return [[DateFormat alloc] initWithType: CustomDateFormatType details: formatString];
}
@end
我的问题:
在我的代码中,dateFromString
returns nil
因为作为参数传递的格式不正确。发生这种情况的原因是因为我使用关联值行转换枚举的方式:case .ISO8601(let isoFormat):
我不知道如何将 case .ISO8601(let isoFormat):
转换为 Objective-C。
问题是具有关联值的枚举仅存在于 Swift,而不存在于 Objective-C。
那么如何在 Objective-C 中转换具有关联值行大小写 .ISO8601(let isoFormat):
的枚举?
解决方案:
编辑:答案很简单,我只需要写:NSString *isoFormat = format.formatDetails;
在问题开头显示的 Objective-C 转换中。 (查看我的 Class DateFormat 实现文件以了解)
让我为您解释一下您的代码:
NSString *isoFormat = ISO8601DateFormatType;
(将字符串 ISO8601
分配给 isoFormat
)
NSString *dateFormat = (isoFormat != nil) ? isoFormat : ISO8601DateFormatType;
(isoFormat
永远不会 nil
所以条件总是为真。如果为假,我们将再次分配字符串 ISO8601
).
NSDateFormatter *formatter = ...
(我们得到了一些格式化程序,这并不重要,因为无论如何我们都会覆盖它的所有重要属性)
formatter.locale = [NSLocale localeWithLocaleIdentifier: (@"en_US_POSIX")];
(让我们用 POSIX 语言环境覆盖上面的 [NSLocale currentLocale]
,没问题)
formatter.timeZone = [NSTimeZone localTimeZone];
(让我们重新设置时区)
formatter.dateFormat = dateFormat;
(让我们将字符串 ISO8601
设置为日期格式,这不是有效的日期格式)
NSDate *date = [formatter dateFromString:(string)];
(让我们尝试使用无效的日期格式 ISO8601
来解析日期。显然,这将 return nil
)
简而言之-问题与您上一个问题中的问题完全相同
注意: 作为练习,我将 Swift 代码转换为 Objective-C.
CODE: 原始 Swift 我转换的代码:
case .ISO8601(let isoFormat):
let dateFormat = (isoFormat != nil) ? isoFormat! : ISO8601Format(dateString: string as String)
let formatter = NSDate.formatter(format: dateFormat.rawValue)
formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
formatter.timeZone = NSTimeZone.localTimeZone()
formatter.dateFormat = dateFormat.rawValue
if let date = formatter.dateFromString(string as String) {
self.init(timeInterval:0, sinceDate:date)
} else {
self.init()
}
我尝试了什么: 我尝试的 Objective-C 转换:
else if([format.dateFormatType compare: ISO8601DateFormatType] == NSOrderedSame) {
NSString *isoFormat = // WHAT DO TO HERE ?;
NSString *dateFormat = (isoFormat != nil) ? isoFormat : ISO8601DateFormatType;
NSDateFormatter *formatter = [NSDate formatterWithFormat: dateFormat andTimeZone: [NSTimeZone localTimeZone ] andLocale: [NSLocale currentLocale]];
formatter.locale = [NSLocale localeWithLocaleIdentifier: (@"en_US_POSIX")];
NSLog([NSString stringWithFormat:@"%@", dateFormat]);
// dateFormat = ISO8601
NSDate *date = [formatter dateFromString:(string)];
//
// ISSUE IS HERRRREEEE ^
//
NSLog([NSString stringWithFormat:@"%@", date]);
// date = nil
if (date != nil){
return [self initWithTimeInterval: 0 sinceDate: date];
}
else {
return [self init];
}
}
我采用的方法是使用单独的 class 来重现具有关联值的 swift 枚举的行为(这最初是一个具有关联值的大型 swift 枚举):
DateFormat.m
#import "DateFormat.h"
@implementation DateFormat
NSString * const ISO8601DateFormatType = @"ISO8601";
NSString * const DotNetDateFormatType = @"DotNet";
NSString * const RSSDateFormatType = @"EEE, d MMM yyyy HH:mm:ss ZZZ";
NSString * const AltRSSDateFormatType = @"d MMM yyyy HH:mm:ss ZZZ";
NSString * const CustomDateFormatType = @"Custom";
NSString * const ISOFormatYear = @"yyyy";
NSString * const ISOFormatYearMonth = @"yyyy-MM"; // 1997-07
NSString * const ISOFormatDate = @"yyyy-MM-dd"; // 1997-07-16
NSString * const ISOFormatDateTime = @"yyyy-MM-dd'T'HH:mmZ"; // 1997-07-16T19:20+01:00
NSString * const ISOFormatDateTimeSec = @"yyyy-MM-dd'T'HH:mm:ssZ"; // 1997-07-16T19:20:30+01:00
NSString * const ISOFormatDateTimeMilliSec = @"yyyy-MM-dd'T'HH:mm:ss.SSSZ"; // 1997-07-16T19:20:30.45+01:00
- (instancetype) initWithType: (NSString *) formatType details: (NSString *) details {
if(self = [super init]) {
_dateFormatType = formatType;
_formatDetails = details;
}
return self;
}
+ (instancetype) ISODateFormat: (NSString *) isoFormat
{
return [[DateFormat alloc] initWithType: ISO8601DateFormatType details: isoFormat];
}
+ (instancetype) DotNetDateFormat
{
return [[DateFormat alloc] initWithType: DotNetDateFormatType details: nil];
}
+ (instancetype) RSSDateFormat
{
return [[DateFormat alloc] initWithType: RSSDateFormatType details: nil];
}
+ (instancetype) AltRSSDateFormat
{
return [[DateFormat alloc] initWithType: AltRSSDateFormatType details: nil];
}
+ (instancetype) CustomDateFormat: (NSString *) formatString
{
return [[DateFormat alloc] initWithType: CustomDateFormatType details: formatString];
}
@end
我的问题:
在我的代码中,dateFromString
returns nil
因为作为参数传递的格式不正确。发生这种情况的原因是因为我使用关联值行转换枚举的方式:case .ISO8601(let isoFormat):
我不知道如何将 case .ISO8601(let isoFormat):
转换为 Objective-C。
问题是具有关联值的枚举仅存在于 Swift,而不存在于 Objective-C。
那么如何在 Objective-C 中转换具有关联值行大小写 .ISO8601(let isoFormat):
的枚举?
解决方案:
编辑:答案很简单,我只需要写:NSString *isoFormat = format.formatDetails;
在问题开头显示的 Objective-C 转换中。 (查看我的 Class DateFormat 实现文件以了解)
让我为您解释一下您的代码:
NSString *isoFormat = ISO8601DateFormatType;
(将字符串 ISO8601
分配给 isoFormat
)
NSString *dateFormat = (isoFormat != nil) ? isoFormat : ISO8601DateFormatType;
(isoFormat
永远不会 nil
所以条件总是为真。如果为假,我们将再次分配字符串 ISO8601
).
NSDateFormatter *formatter = ...
(我们得到了一些格式化程序,这并不重要,因为无论如何我们都会覆盖它的所有重要属性)
formatter.locale = [NSLocale localeWithLocaleIdentifier: (@"en_US_POSIX")];
(让我们用 POSIX 语言环境覆盖上面的 [NSLocale currentLocale]
,没问题)
formatter.timeZone = [NSTimeZone localTimeZone];
(让我们重新设置时区)
formatter.dateFormat = dateFormat;
(让我们将字符串 ISO8601
设置为日期格式,这不是有效的日期格式)
NSDate *date = [formatter dateFromString:(string)];
(让我们尝试使用无效的日期格式 ISO8601
来解析日期。显然,这将 return nil
)
简而言之-问题与您上一个问题中的问题完全相同