2016-11-30 1 views
0

Ich versuche, ein DateFormatter nur einmal für die Klasse zu instanziieren, also verschwende ich nicht eine Menge Rechenzeit, es für jede Instanz zu tun. In Obj-C instanziiere ich eine statische Eigenschaft, um dies zu erreichen. Ich versuche herauszufinden, wie man das in Swift macht und die meisten Erklärungen, die ich gelesen habe, beantworten diese Frage nicht genau.Statisch in ObjC vs Statisch in Swift

In Obj-C:

- (NSDateFormatter *)dateFormatter { 
    static NSDateFormatter *dateFormatter = nil; 
    if (!dateFormatter) { 
     dateFormatter = [[NSDateFormatter alloc] init]; 
     dateFormatter.dateStyle = NSDateFormatterMediumStyle; 
    } 
    return dateFormatter; 
} 

Swift Übersetzung?

static var dateFormatter: DateFormatter { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateStyle = .medium 
    return dateFormatter 
} 
+1

können Sie lassen die Compiler die Aufzählung schließen : "dateFormatter.dateStyle = .medium" – Alexander

Antwort

3

Sie müssen die statische Variable auf Klassenebene erklären:

class MyClass { 
    static var dateFormatter: DateFormatter = { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateStyle = DateFormatter.Style.medium 
     return dateFormatter 
    }() 
} 
2

Ein fauler statische Konstante ohne self in Swift verwendet, ist

static let dateFormatter: DateFormatter = { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateStyle = .medium 
    return dateFormatter 
}() 

Der gleiche Code initialisiert (ohne static) als Instanzeigenschaft ist auch eine Konstante, wird aber nicht träge initialisiert.

Das Schlüsselwort static im ObjC-Code ist jedoch ein wenig irreführend. Die 1: 1 entspricht dem Code ist ObjC

lazy var dateFormatter: DateFormatter = { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateStyle = .medium 
    return dateFormatter 
}() 

Die Variable lazily initialisiert wird, sondern ist ein Beispiel Eigenschaft.

+0

also verwende ich die Lazy Notation, aber nicht das Faul Keyword? – Alex

+0

Aus der Dokumentation: * Gespeicherte Typeigenschaften werden bei ihrem ersten Zugriff langsam initialisiert. Sie werden garantiert nur einmal initialisiert, auch wenn mehrere Threads gleichzeitig darauf zugreifen, und sie müssen nicht mit dem lazy-Modifikator markiert werden. * Type-Eigenschaften sind die 'statischen'. – vadian

+0

Entschuldigung, ich bin mit der Terminologie nicht so vertraut. Wollen Sie damit sagen, dass das, was ich erstellen möchte, eine 'gespeicherte Eigenschaft' ist? Dies wird mit dieser Syntax erstellt, und ich die einzige Sache, die "statisch" macht es faul, wenn die Klasse zuerst erstellt/aufgerufen wird, anstatt beim Start? – Alex

0

Im Anschluss an die Antwort von @CodeDifferent, können Sie die statischen in einem class var wickeln, da dies ermöglicht es Ihnen, das Datum Formatierer in einer Unterklasse außer Kraft zu setzen:

class MyClass { 

    fileprivate static let mediumDateFormatter: DateFormatter = { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateStyle = .medium 
    return dateFormatter 
    }() 

    class var dateFormatter: DateFormatter { 
     return mediumDateFormatter 
    } 
} 

class MyOtherClass: MyClass { 

    fileprivate static let shortDateFormatter: DateFormatter = { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateStyle = .short 
     return dateFormatter 
    }() 

    override class var dateFormatter: DateFormatter { 
     return shortDateFormatter 
    }  
}