2016-04-02 42 views
0

我有一个问题,这个迅速枚举转换成Objective-C的:如何将Swift enum:String转换为Objective-C枚举:NSString?

public enum ISO8601Format: String { 

case Year = "yyyy" // 1997 
case YearMonth = "yyyy-MM" // 1997-07 
case Date = "yyyy-MM-dd" // 1997-07-16 
case DateTime = "yyyy-MM-dd'T'HH:mmZ" // 1997-07-16T19:20+01:00 
case DateTimeSec = "yyyy-MM-dd'T'HH:mm:ssZ" // 1997-07-16T19:20:30+01:00 
case DateTimeMilliSec = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" // 1997-07-16T19:20:30.45+01:00 

    init(dateString:String) { 
     switch dateString.characters.count { 
     case 4: 
      self = ISO8601Format(rawValue: ISO8601Format.Year.rawValue)! 
     case 7: 
      self = ISO8601Format(rawValue: ISO8601Format.YearMonth.rawValue)! 
     case 10: 
      self = ISO8601Format(rawValue: ISO8601Format.Date.rawValue)! 
     case 22: 
      self = ISO8601Format(rawValue: ISO8601Format.DateTime.rawValue)! 
     case 25: 
      self = ISO8601Format(rawValue: ISO8601Format.DateTimeSec.rawValue)! 
     default:// 28: 
      self = ISO8601Format(rawValue: ISO8601Format.DateTimeMilliSec.rawValue)! 
     } 
    } 
} 

public enum DateFormat { 
case ISO8601(ISO8601Format?), DotNet, RSS, AltRSS, Custom(String) 
} 

我已经无处不在研究这一点,并发现这一点,这一点:

Best way to enum NSString

enum Values to NSString (iOS)

没”我非常理解这些答案。我正在寻找更现代的Objective-C语法的更优雅的解决方案(如果有的话)或更好地解释这些答案。

谢谢!

+0

我真的不明白枚举的目的。这是一个非常奇怪的使用枚举。 – Sulthan

+0

似乎并不奇怪*使用枚举给我(看苹果已经显示[用enum代表条形码](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/) Swift_Programming_Language/Enumerations.html#// apple_ref/DOC/UID/TP40014097-CH12-ID148)!)。没有任何“优雅的解决方案”将其转换为Objective-C。在C语言中,枚举只是荣耀的整数 - 不像在Swift中他们更强大。您必须将enum包含在额外的逻辑中才能将枚举的整数值转换为字符串,以作为链接显示的问题的答案。 – Hamish

+1

虽然我很困惑,为什么你要做self = ISO8601Format(rawValue:ISO8601Format.Year.rawValue)!'....为什么不只是'self = .Year'? – Hamish

回答

0
NSString * const ISO8601DateFormatType = @"ISO8601"; 
NSString * const DotNetDateFormatType = @"DotNet"; 
NSString * const RSSDateFormatType = @"RSS"; 
NSString * const AltRSSDateFormatType = @"AltRSS"; 
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 

@interface DateFormat : NSObject 

    + (instancetype) ISODateFormat: (NSString *) isoFormat; 
    + (instancetype) DotNetDateFormat; 
    + (instancetype) RSSDateFormat; 
    + (instancetype) AltRSSDateFormat; 
    + (instancetype) CustomDateFormat: (NSString *) formatString; 

    @property (readonly) NSString *dateFormatType; 
    @property (readonly) NSString *formatDetails; 

@end 

@implementation DateFormat 

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