2017-01-08 5 views
0

Ich arbeite derzeit an iOS App w/Beacons (Estimote, wenn es darauf ankommt).For Schleife in Funktionsdeklaration

Ich heruntergeladen Estimote SDK mit Codebeispielen, modifiziert sie, um meine Bedürfnisse zu erfüllen, jedoch sie Liste der Geräte hardcodieren, die ich nicht finden kann, eine Möglichkeit zu ändern.

Um zu klären, folgende func fügt BeaconID:

self.proximityContentManager = ProximityContentManager(
     beaconIDs: [ 
      BeaconID(UUIDString: "B9407F30-F5F8-466E-AFF9-25556B57FE6D", major: 12461, minor: 34159), 
      BeaconID(UUIDString: "B9407F30-F5F8-466E-AFF9-25556B57FE6D", major: 37813, minor: 3), 
      BeaconID(UUIDString: "B9407F30-F5F8-466E-AFF9-25556B57FE6D", major: 33562, minor: 37486), 
     BeaconID(UUIDString: "B9407F30-F5F8-466E-AFF9-25556B57FE6D", major: 5913, minor: 4), 
     ], 

     beaconContentFactory: CachingContentFactory(beaconContentFactory: BeaconDetailsCloudFactory())) 

Mein Problem ist, dass ich 3-Arrays in einer Struktur, wo ich Beacons Daten speichern:

struct BeaconsStruct { 
    static var uuidT: [String] = [] 
    static var minorT: [String] = [] 
    static var majorT: [String] = [] 
} 

Ich frage mich, wie kann ich Run-for-Loop mit BeaconID-Funktion und UUID, Major, Minor-Set als Variable, die Beacon-Liste von meinen Arrays lädt, nicht direkt im Code hartcodieren. Dies ist wichtig, da ein Teil meiner App die Beacon-Liste von JSON abruft und diese in eine obige Struktur schreibt.

+0

Warum nicht einfach die '[BeaconID]' - Liste speichern und diese übergeben? Warum brauchen Sie einen zusätzlichen Satz von Arrays? Machen Sie einfach Ihre Variable 'let beacons = [BeaconID (UUIDstring: ...), BeaconID (UUIDstring: ...) ...]' Speichern Sie niemals drei parallele Arrays, wenn Sie es helfen können. Speichern Sie ein einzelnes Array von Strukturen. Sie sollten die Neben-/Hauptnummern auf keinen Fall als Strings speichern. Es ist nicht klar, warum Sie BeaconsStruct (oder wo Sie es bekommen haben) erstellt haben. –

Antwort

2

Dies ist vielleicht nicht die schnellste Lösung, aber es funktioniert und ist einfach:

Unter der Annahme, dass diese drei Arrays werden alle gleich lang sein:

static var uuidT: [String] = [] 
static var minorT: [String] = [] 
static var majorT: [String] = [] 

Sie Schleife durch alle drei von ihnen bei die gleiche Zeit und erstellen BeaconID Objekte:

var beaconIDs = [BeaconID]() 
for i in 0..<uuidT.count { 
    beaconIDs.append(BeaconID(UUIDString: uuidT[i], major: Int(majorT[i])!, minor: Int(minorT[i])!)) 
} 

Dann können Sie Ihre Nähe Content-Manager erstellen:

self.proximityContentManager = ProximityContentManager(
     beaconIDs: beaconIDs, 
     beaconContentFactory: CachingContentFactory(beaconContentFactory: BeaconDetailsCloudFactory())) 
+0

Danke, sie sind gleich lang, jedoch habe ich beaconIDs.append (BeaconID (UUIDstring: BeaconsStruct.uuidT [i], Dur: Int (BeaconsStruct.majorT [i]) !, Moll: Int (BeaconsStruct.minorT [i])!)) auf die Struktur zugreifen und ich bekomme immer Fehler: generischer Parameter 'Element' konnte nicht interferiert werden –

0

Dies kann Schleife ohne ein in einer „deklarativen“ Art und Weise erfolgen:

var beaconIDs = uuidT.enumerated().map 
       { BeaconID(UUIDString: $1, major: Int(majorT[$0])!, minor: Int(minorT[$0])!) } 

oder, wenn Sie aus dem Funktionstyp Gießen/Conversions halten wie Anrufe:

var beaconIDs = zip(majorT.map{Int($0)!}, minorT.map{Int($0)!}).enumerated().map 
       { BeaconID(UUIDString: uuidT[$0], major: $1.0, minor: $1.1) } 

ich persönlich vorziehen würde die minorT und majorT Array in den entsprechenden (Int) Speicherung und Verwendung nur:

var BaconIDs = uuidT.indices.map 
       { BeaconID(UUIDString: uuidT[$0], major: majorT[$0], minor: minorT[$0]) }