2016-04-26 7 views
-5

注:練習として、SwiftコードをObjective-Cに変換しています。SwiftからObjective-Cに関連する値を持つパラメータ化されたenum/enumを変換するにはどうすればよいですか?


CODE:私は変換元オリジナルスウィフトコード:私が試しWHAT

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

私が取ったアプローチは、別のclを使用することでした

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 

MY ISSUE:関連する値(これは、関連する値を持つもともと大迅速列挙した)との迅速な列挙型の動作を再現するためにお尻

私のコードでは、dateFromStringは、パラメータとして渡されたフォーマットが正しくないため、nilを返します。その理由は、列挙型を関連する値行で変換したためです。case .ISO8601(let isoFormat):

case .ISO8601(let isoFormat):をObjective-Cに変換する方法がわかりません。

関連する値を持つ列挙型はObjective-CではなくSwiftにのみ存在するという問題があります。

Objective-Cでは関連する値の大文字小文字の.ISO8601(let isoFormat):を使用してその列挙型をどのように変換できますか?


SOLUTION:

EDIT:答えは簡単だった、私はちょうど書かなければならなかった:私は質問の冒頭で示したObjective-Cの変換でNSString *isoFormat = format.formatDetails;。 (理解することが私のクラスDateFormatの実装ファイルを確認してください)

+3

はhttp://stackoverflow.com/questions/36753954/のコピー本ではないですdescription-label-doesnt-appear-in-my-tableviewcontroller-cells? [最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve) – Sulthan

+0

を書くまで、私たちはあなたを助けることはできません。それがJALによって答えられました! –

+0

これは別の問題です。しかし、DateFormatクラスはどこでも使用されているので、何らかのコードが再び表示されます。 –

答えて

2

私はあなたのためにあなたのコードを説明してみましょう:

NSString *isoFormat = ISO8601DateFormatType; 

isoFormatに文字列ISO8601を割り当て)

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を使用して日付を解析してみましょう。明らかに、これは要するにnil

を返します - 問題あなたの前の質問で問題と全く同じであるError in dateFormat returns nil

+0

@ Coder1000 'formatter'に正しい日付フォーマットを割り当てます。あなたがより良い答えをしたいなら、まずはより良い質問をする必要があります。 – Sulthan

+0

私の質問は基本的に次のようになります: '.ISO8601(let isoFormat):'? – Coder1000

+0

@ Coder1000あなたの実装を知らずに知るのは難しいですが、 'NSString * isoFormat = format.formatDetails;' – Sulthan

関連する問題