2016-05-12 9 views
-1

Ich verwende setValue, um Eigenschaften in meiner Klasse festzulegen und ein sehr seltsames Verhalten zu erhalten. Beim Versuch, eine bestimmte Eigenschaft festzulegen, wird die Ausführung meine Funktion unterbrechen und von dem, was sie aufgerufen hat, weitergehen. Keine Kompilierungsfehler und keine Fehler in der Debug-Konsole. Stripped Beispiel hier:XCode fängt keinen Fehler

class User: NSObject{ 
    var profilePictureURL: NSURL? 
    var contextId: String? 
    var isOnboarded: Bool? 

    func populate(data: [String: AnyObject]){ 
    for(key,value) in data { 
     switch key { 
     case "profilePictureURL": 
     self.setValue(NSURL(string: String(value)), forKey: key) 
     } 
     case "contextId": 
     self.setValue(String(value), forKey: key) 
     } 
     case "isOnboarded": 
     if let boolValue = value as? Bool { 
      self.setValue(boolValue, forKey: key) // Here is the problem line 
     } 
    } 
    } 
} 

Ich setze einige Haltepunkte und führen Sie die App. Wenn ich mit einigen Benutzerdaten auffüllen, funktioniert setValue ordnungsgemäß für profilePictureURL und contextId. Aber sobald es die setValue für die isOnboardedBool erreicht, existiert es nur meine Funktion, als ob es eine return-Anweisung wäre. Kein Fehler, nichts im Debug-Fenster. Ich setze einen Haltepunkt auf dieser Linie, verifiziere, dass boolVal tatsächlich als Bool getippt wird, und versuche, über die Linie zu treten. XCode bricht dann aus dieser Klasse heraus, setzt niemals diese Variable und stoppt am nächsten Haltepunkt (in einer anderen Klasse). Es beendet nur die Funktion. Es ist bizarr.

Wenn es einen Fehler gab, würde ich erwarten, dass XCode mich auf irgendeine Weise benachrichtigt. Nur die Ausführung bis zum nächsten Haltepunkt zu überspringen, macht dies unmöglich zu debuggen. Ich habe keine Ahnung, was mit diesem Code nicht stimmt.

Gibt es etwas, das ich hier hinzufügen kann, um festzustellen, was das Problem ist? Ist das ein seltsamer Swift/Xcode Bug?

Edit: Ich habe versucht, DerivedData zu löschen und Clean ausgeführt.

Edit 2: Ich konnte das nicht herausfinden. Ich hatte einige Tippfehler in meinem Beispielcode oben, aber sie waren für das vorliegende Problem nicht relevant. Aus irgendeinem Grund setValue verhält sich wie ein return, verlassen Sie einfach die Funktion ohne Fehler. Ich habe wie so wieder explizit Einstellwerten gefallen:

self.contentId = String(value) 
+0

Überprüfen Sie die geschweiften Klammern in Ihrem Switch-Fall ... zu viele Abschlubkonzert. – BallpointBen

Antwort

0

Statt

var isOnboarded: Bool? 

versuchen

var isOnboarded: Bool = false 

auch sicherstellen, dass Ihr Wörterbuch in etwa so strukturiert ist:

let userDict : [String:AnyObject] = ["profilePictureURL": NSURL(string: "www.google.com")!, 
             "contextId" : "anID", 
             "isOnboarded" : true] 

bec AVerwenden Ich glaube, Sie wahrscheinlich andere als ein Bool, um etwas „isOnboarding“ setzen und es verlässt, nur weil

if let boolValue = value as? Bool 

falsch

mir zurückkehrt sagen, wie das

0

geht Es gibt ein paar Fehler in dein Code. Und einfach if mit macht den Job und ist weniger fehleranfällig in diesem Fall:

class User: NSObject { 
    var profilePictureURL: NSURL? 
    var contextId: String? 
    var isOnboarded: Bool = false 

    func populate(data: [String: AnyObject]){ 
     for(key,value) in data { 
      if key == "profilePictureURL" { 
       self.setValue(NSURL(string: String(value)), forKey: key) 
      } else if key == "contextId" { 
       self.setValue(String(value), forKey: key) 
      } else if key == "isOnboarded" { 
       if let boolValue = value as? Bool { 
        self.setValue(boolValue, forKey: key) 
       } 
      } 
     } 
    } 
} 

Verbrauch:

let source = ["profilePictureURL": "test.org", "contextId": 33, "isOnboarded": true] 
let user = User() 
user.populate(source) 

Aber es ist noch besser, meiner Meinung nach: Sie brauchen sich nicht zu Schleife über Ihr Wörterbuch, sollten Sie Werte im Initialisierer erstellen und Swift-Strukturen verwenden.Beispiel:

struct User { 
    var profilePictureURL: NSURL? 
    var contextId: String? 
    var isOnboarded: Bool? 

    init(data: [String: AnyObject]) { 
     if let profile = data["profilePictureURL"] as? String { 
      self.profilePictureURL = NSURL(string: profile) 
     } 
     if let id = data["contextId"] as? Int { 
      self.contextId = String(id) 
     } 
     if let onboard = data["isOnboarded"] as? Bool { 
      self.isOnboarded = onboard 
     } 
    } 
} 

Verbrauch:

let source = ["profilePictureURL": "test.org", "contextId": 33, "isOnboarded": true] 
let user = User(data: source)