2017-02-10 3 views
1

Ich schreibe ein Cordova-Plugin für HealthKit und meine Aufgabe ist es, sicherzustellen, dass wir mehr oder weniger dynamisch Daten von HK lesen können. Ich mache den nativen Teil in swift. Aber ich schreibe meistens JavaScript, daher bin ich mit dem Swift-Teil etwas verloren.Wie kann ich eine Klassenmethode in Swift aufrufen, wenn ich nur die Zeichenfolge habe?

Ich möchte in der Lage sein, Methoden mit nur einer Zeichenfolge dynamisch aufzurufen.

let store = HKHealthStore() 

    do { 
     let bloodType: HKBloodTypeObject = try store.bloodType() 
... 

Das ist ein Beispiel, Blutgruppe zu lesen. Ich bin kein Swift Entwickler, aber ist es eine Möglichkeit, diese dynamisch zu tun, wie ich in Javascript tun würde:

... // assuming this function receives a string as paramater 
let param[0] = try store[param[0]]() // <-- how to do this in Swift? 

dann kann ich an einen Server sprechen und eine Liste der Eigenschaften erhalten und laden sie dynamisch aus Healthkit, ohne meinen Code und Hardcode für jedes mögliche Merkmal aktualisieren zu müssen.

Antwort

0

Erstellen Sie eine Zuordnung von Ihren Parameterzeichenfolgen zu einer API-Enumeration.

enum API: String { 
    case function1 = "function1" 
    case function2 = "functionTwo" 
    case function3 = "threethreethree" 
} 

Erstellen Sie eine Relay-Funktion, die die API-Enumeration der Swift-Funktion zuordnet.

func callTheCorrectFunction(_ api: API) { 
    switch api { 
    case .function1: updateBlood() 
    case .function2: spinAround() 
    case .function3: jump() 
    } 
} 

Konstruieren Sie Ihren Funktionsaufruf mit Enum rawValue Initialisierer.

let param = fromSomeJsonStrings[0] 
let api = API(rawValue: param) 
callTheCorrectFunction(api) 

Alternativ können Sie ein Wörterbuch-Mapping von [String: Function] in der gleichen Weise nutzen.

typealias Function =() ->() 
let dict = { 
    "function1": updateBlood, 
    "function2": spinAround, 
} 
dict[param[0]]() 
+0

Gibt es etwas, das ich Sie hartzucodieren updateBlood hier nicht verstehen, oder am Ende auch(), spinAround(), etc? – Elemenofi

+0

Ich meine ... Sie müssen die Methode irgendwann fest codieren. So wissen Sie, welche Methode Sie anrufen sollen. Dies führt jedoch nur eine Zuordnung zwischen Strings und Funktionen ein. – sdasdadas

+0

ich verstehe, aber dann bin ich in dem gleichen Problem. die Sache ist, dass wie Apple HKHealthStore erweitert ich möchte in der Lage sein, neue Eigenschaften dynamisch zu lesen, ohne das Plugin zu ändern ... so muss ich in der Lage zu tun HKHealthStore ['somethingNew']() – Elemenofi

Verwandte Themen