2017-06-04 7 views
0

Ich versuche, ein Prädikat basierend auf einem Segment-Controller-Schalter zu definieren.Wenn else Anweisung ein NSPredikat zu definieren

if self.streamtype == "case1" { 
    let predicatearray = defaults.object(forKey: "case1") as! [String] 
    let predicate = NSPredicate(format: "UserID IN %@" , predicatearray) 
} else if self.streamtype == "case2" { 
    let predicate = NSPredicate(format: "TRUEPREDICATE", argumentArray: nil) 
} else { 
    let predicatearray = defaults.object(forKey: "case3") as! [String] 
    let predicate = NSPredicate(format: "UserID IN %@", predicatearray) 
} 

let publicData = CKContainer.default().publicCloudDatabase 
let query = CKQuery(recordType: "Post", predicate: predicate) 

Ich erhalte eine Fehlermeldung, dass:

„: eine konkrete Instanz erstellen kann nicht auf ein abstraktes Objekt der Klasse NSPredicate geschickt werden!“

Außerdem sagt es mir, dass die Initialisierung der Prädikatvariablen nie verwendet wurde. Ich habe versucht, die Funktion ein paar verschiedene Möglichkeiten zu schreiben, aber das machte für mich am meisten Sinn, da ich das Prädikat nur aktualisieren muss, wenn ich neue Informationen lade, also füge ich einfach beide Funktionen zusammen.

Antwort

2

Sie definieren das Prädikat innerhalb des Bereichs if {} oder else {}, deshalb ist es außerhalb des Bereichs nicht sichtbar.

var predicate : NSPredicate! 
if self.streamtype == "case1" { 
    let predicatearray = defaults.object(forKey: "case1") as! [String] 
    predicate = NSPredicate(format: "UserID IN %@", predicatearray) 
} else if self.streamtype == "case2" { 
    predicate = NSPredicate(format: "TRUEPREDICATE", argumentArray: nil) 
} else { 
    let predicatearray = defaults.object(forKey: "case3") as! [String] 
    predicate = NSPredicate(format: "UserID IN %@", predicatearray) 
} 

let publicData = CKContainer.default().publicCloudDatabase 
let query = CKQuery(recordType: "Post", predicate: predicate)