2016-05-12 3 views
-1

私はsetValueを使用してクラス内のプロパティを設定し、非常に奇妙な動作をします。特定のプロパティを設定しようとすると、実行は自分の機能を壊し、それを呼び出すものから続行します。デバッグコンソールにコンパイルエラーはなく、エラーもありません。ここに例を取り除きました:XCodeがエラーをキャッチしていません

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 
     } 
    } 
    } 
} 

いくつかのブレークポイントを設定してアプリを実行します。一部のユーザーデータを入力して呼び出すと、setValueprofilePictureURLcontextIdに対して正しく機能します。しかし、それがisOnboardedBoolsetValueに達すると、私の機能はあたかもreturnのようになります。エラーはなく、デバッグウィンドウには何も表示されません。私はその行にブレークポイントを設定し、boolValが実際にはBoolとタイプされていることを確認し、その行をステップインしようとします。 XCodeはこのクラスから抜け出し、そのvarを決して設定せず、(別のクラスの)次のブレークポイントで停止します。関数を終了するだけです。それは奇妙です。

エラーが発生した場合は、XCodeが何らかの方法で私に通知すると思います。実行を次のブレークポイントにジャンプするだけで、デバッグが不可能になります。私はこのコードで何が間違っているのか分かりません。

問題の原因を特定するためにここに追加できるものはありますか?これは奇妙なSwift/Xcodeのバグですか?

編集:私はDerivedDataをクリアし、Cleanを実行しようとしました。

編集2:私はこれを理解することができませんでした。私は上記の私のコード例でいくつかのタイプミスをしていましたが、手元の問題には関係ありませんでした。なんらかの理由でsetValuereturnのように振る舞いますが、単にエラーのない関数を終了します。私はそうのように明示的に設定値に戻って落ちたんだ:

self.contentId = String(value) 
+0

あなたのスイッチケース...あまりにも多くの閉じたもので、中括弧をチェックしてください。 – BallpointBen

答えて

0

代わり

var isOnboarded: Bool? 

var isOnboarded: Bool = false 

はまた、あなたの辞書は、このようなものを構造化されていることを確認してみてください。

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

bec

if let boolValue = value as? Bool 

が偽

を返しているので、ause私はあなたがおそらくブール以外に「isOnboarding」を設定しているとそれだけで終了していると思うが

0

をどのようになるにはいくつかのエラーがあります教えてくださいあなたのコード。そして、単にifを使用して仕事をしていませんし、この場合には以下のエラーが発生しやすいです:

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) 
       } 
      } 
     } 
    } 
} 

使用法:

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

しかし、私の意見ではさらに良いがあります:あなたがする必要はありませんあなたのディクショナリにループを作成し、イニシャライザに値を作成し、Swift構造体を使用する必要があります。例:

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 
     } 
    } 
} 

は使用方法:

let source = ["profilePictureURL": "test.org", "contextId": 33, "isOnboarded": true] 
let user = User(data: source) 
関連する問題