2016-03-29 16 views
1

Ich verwende Realm und es hat Funktion, die als ein Argument eine Klasse erben von Object (nicht NSObject), z.Verwenden Realm-Unterklasse als benutzerdefinierten Funktionsparameter

realm.objects(Class) 

Ich möchte eine Funktion machen, die auch Class als Parameter übernimmt.

Ich möchte Funktion machen, die eine Klasse nehmen und sie zu Realms Funktion weiterleiten wird. Ich habe versucht, so etwas wie diese, aber es funktioniert nicht:

func test(type: AnyClass) { 
    let realm = .. 
    realm.objects(type) 
} 

Der Swift-Compiler meldet einen Fehler zu sagen, dass es nicht AnyClass-Object.Type

fand ich eine ähnliche Frage hier werfen kann: Pass a Swift class as parameter, and then call a class method out of it

Aber vielleicht gibt es eine einfachere Lösung, die keine Protokollimplementierung für jede Klasse erfordert? Ich möchte, dass die Funktion die Entscheidung trifft, was sie selbst tun soll, je nachdem, welche Klasse sie empfängt.

Ich möchte es wie realm.objects(Class) aussehen.

Antwort

1

Sie können die gleiche Signatur verwenden: objects Deklaration sieht wie folgt aus:

func objects<T: Object>(type: T.Type) -> Results<T> 

So benötigen Sie eine generische Funktion, um die Art zu Subklassen von Realm.Object beschränke:

func test<T: Object>(type: T.Type) { 
    let realm = ... 
    realm.objects(type) 
} 

Dann unter der Annahme, dass Ihr Klasse (MyClass in diesem Beispiel) erbt von Realm.Object, können Sie es so nennen:

class MyClass: Object {} 

test(MyClass) 

Wenn Ihre Methode ein Objekt dieser Art nimmt, können Sie den Typ ableiten:

func test<T: Object>(element: T) { 
    let realm = ... 
    realm.objects(T.self) 
} 
Verwandte Themen