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 class
oder 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
class
Schlü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, class
ob es sich um eine Klasse oder um static
eine Struktur handelt.
class MyClass : {
class func aClassMethod() { ... }
func anInstanceMethod() { ... }
}
func
Schlü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] = []
}