【问题标题】:How to convert a Swift enum: String into an Objective-C enum: NSString?如何将 Swift 枚举:字符串转换为 Objective-C 枚举:NSString?
【发布时间】:2016-04-02 11:50:03
【问题描述】:

我在将此快速枚举转换为 Objective-C 时遇到问题:

 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 语法更好地解释这些答案。

谢谢!

【问题讨论】:

  • 我不太明白枚举的目的。这是一个非常奇怪的枚举用法。
  • 在我看来,枚举的使用并不奇怪(就像 Apple 展示的 representing a barcode with an enum!)。不会有任何“优雅的解决方案”将其转换为 Objective-C。在 C 中,枚举只是被美化的整数——不像在 Swift 中,它们方式更强大。您必须将枚举包装在额外的逻辑中,以将枚举的整数值转换为字符串,作为您链接到的问题的答案。
  • 虽然我很困惑你为什么要这样做self = ISO8601Format(rawValue: ISO8601Format.Year.rawValue)!.... 为什么不只是self = .Year

标签: ios objective-c enums nsstring


【解决方案1】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2015-06-10
    • 2013-08-07
    • 2021-05-07
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多