2016-04-16 17 views
0

Ich konvertiere eine Swift Library in Objective-C als Übung.Wie konvertiert man diese Swift-Syntax in Objective-C?

Wie konvertiert man dies in Objective-C?

let formatter = NSDate.formatter(format: dateFormat) 

Ich habe versucht:

NSDateFormatter *formatter = [NSDate formatterWithFormat : dateFormat]; 

Auch dies versucht:

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

auch versucht, diese:

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

Fehler: keine Know-Klassenmethode für Wähler „formatterWithFormat: "oder" Formatierer ::: "

Weitere Kontext:

+ (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; 
    } 
} 

Einige Zufallstext in-zwischen so wird so lassen Sie mich mehr Code hinzufügen ...

+ (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; 
    } 
} 

Original-Swift Code:

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

Irgendein zufälliger Text dazwischen, also läßt SO mich mehr Code hinzufügen ...

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

Wenn das die Methode ist, die Sie aufrufen möchten, müssen Sie alle 3 Parameter übergeben, nicht nur einen. – rmaddy

+0

Und was ist der Punkt, an dem diese drei Parameter übergeben werden, wenn Sie einfach ihre Werte überschreiben? Du hast den Code, den ich dir in deiner vorherigen Frage gegeben habe, nicht benutzt. – rmaddy

+0

Eigentlich habe ich. Lassen Sie mich das zur Frage hinzufügen. Bitte beachte, dass ich dies aus einem vorhandenen Swift-Code konvertiere und versuche, es so ähnlich wie möglich zu halten. –

Antwort

0

Basierend auf all Ihren Aktualisierungen besteht der Hauptunterschied zwischen Ihrem Objective-C-Code und Swift-Code darin, dass die Swift-Funktion Standardwerte für die Parameter bereitstellt. Dadurch können Sie die Funktion (in diesem Fall) mit null oder mehr Argumenten aufrufen.

Da Objective-C keine Standardparameterwerte unterstützt, müssen Sie für jeden Parameter einen Wert übergeben.

Die Methode:

[WhateverClassThisIs formatter:someFormat :someTimeZone :someLocale]; 

Hinweis auf Grund Sie nicht alle Parameter zu benennen (wie ich die hässliche Syntax in Ihrer vorherigen Frage zeigte

:

+ (NSDateFormatter *) formatter : (NSString *) format : (NSTimeZone*) timeZone : (NSLocale *) locale { 
} 

Bedürfnisse genannt werden.

Sie müssen auch die Zeilen entfernen, die Sie hinzugefügt haben, um diesen Parametern am Anfang der Methode Werte zuzuweisen.

+0

Ok, ich habe Folgendes versucht: NSDateFormatter * formatter = [NSDate formatterWithFormat: dateFormat: [NSTimeZone localTimeZone]: [NSLocale currentLocale]]; aber ich bekomme immer noch den gleichen Fehler. –

+0

Siehe meine aktualisierte Antwort. – rmaddy

+0

BTW (und bitte nehmen Sie dies als hilfreiche, konstruktive Kommentar ist es gemeint) - angesichts all der Fragen, die Sie die letzten Tage gestellt haben, empfehle ich dringend, Sie finden ein gutes Tutorial über die Objective-C-Programmiersprache. Die Zeit, die du damit verbracht hast, die Syntax zu lernen, wird dir eine Menge Zeit sparen, wenn du dich weiterbewegst. – rmaddy

2

Ihre Umwandlung der Syntax ist syntaktisch korrekt.

NSDate bietet jedoch keine statische Methode namens formatterWithFormat: oder formatter; Es scheint, dass der Code, aus dem Sie übersetzen, eine Erweiterung Methode dafür hat. Sie müssen diese Methode suchen und stattdessen übersetzen.

Hinweis: Ich würde stark gegen empfehlen es eine Erweiterung auf NSDate machen, weil es zu NSDateFormatter Seite der Klassenhierarchie gehört.

+0

Ich stimme dem Hinweis zu. Es macht keinen Sinn, eine solche Methode in der Klasse "NSDate" zu verwenden. – rmaddy

+0

Ich denke, ich muss mehr Kontext bereitstellen. Ich werde meine Frage bearbeiten. –

Verwandte Themen