Klassenmethoden (oder statische Methoden) in Objective-C wurden mithilfe +von Deklarationen durchgeführt.
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
Wie kann dies in Swift erreicht werden?
Klassenmethoden (oder statische Methoden) in Objective-C wurden mithilfe +von Deklarationen durchgeführt.
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
Wie kann dies in Swift erreicht werden?
Antworten:
Sie werden als Typeneigenschaften und Typmethoden bezeichnet, und Sie verwenden die Schlüsselwörter classoder static.
class Foo {
var name: String? // instance property
static var all = [Foo]() // static type property
class var comp: Int { // computed type property
return 42
}
class func alert() { // type method
print("There are \(all.count) foos")
}
}
Foo.alert() // There are 0 foos
let f = Foo()
Foo.all.append(f)
Foo.alert() // There are 1 foos
classSchlüsselwort nicht vor einer Funktion oder einer Eigenschaft mit berechnetem Typ.
Sie werden in Swift als Typeneigenschaften und Typmethoden bezeichnet, und Sie verwenden das Schlüsselwort class.
Deklarieren einer Klassenmethode oder Typmethode in Swift:
class SomeClass
{
class func someTypeMethod()
{
// type method implementation goes here
}
}
Zugriff auf diese Methode:
SomeClass.someTypeMethod()
oder Sie können Methoden schnell verweisen
Stellen Sie der Deklaration vor, classob es sich um eine Klasse oder um staticeine Struktur handelt.
class MyClass : {
class func aClassMethod() { ... }
func anInstanceMethod() { ... }
}
funcSchlüsselwort hier nicht?
Swift 1.1 hat keine Klasseneigenschaften gespeichert. Sie können es mithilfe einer Closure-Class-Eigenschaft implementieren, die ein zugeordnetes Objekt abruft, das an das Klassenobjekt gebunden ist. (Funktioniert nur in Klassen, die von NSObject abgeleitet sind.)
private var fooPropertyKey: Int = 0 // value is unimportant; we use var's address
class YourClass: SomeSubclassOfNSObject {
class var foo: FooType? { // Swift 1.1 doesn't have stored class properties; change when supported
get {
return objc_getAssociatedObject(self, &fooPropertyKey) as FooType?
}
set {
objc_setAssociatedObject(self, &fooPropertyKey, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
}
}
....
}
Stellen Sie die Deklaration mit class oder static voran, wenn es sich um eine Funktion handelt, oder mit static, wenn es sich um eine Eigenschaft handelt.
class MyClass {
class func aClassMethod() { ... }
static func anInstanceMethod() { ... }
static var myArray : [String] = []
}