XCode没有捕获错误

时间:2016-05-12 02:16:04

标签: ios xcode swift debugging

我正在使用setValue在我的课堂中设置属性并获得一个非常奇怪的行为。在尝试设置某个属性时,执行将突破我的函数并继续从任何调用它。调试控制台中没有编译错误和错误。在这里删除示例:

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

我设置了一些断点并运行应用程序。当我使用某些用户数据填充时,setValue可以正常使用profilePictureURLcontextId。但是,一旦它达到setValue isOnboarded的{​​{1}},它就会将我的函数存在,就好像它是Bool语句一样。没有错误,调试窗口中没有任何内容。我在该行上设置了断点,验证return实际上是作为boolVal键入,并尝试跳过该行。然后XCode突破该类,从不设置该var,并在下一个断点(在另一个类中)停止。它只是退出功能。这很奇怪。

如果出现错误,我希望XCode以某种方式通知我。只是将执行跳转到下一个断点使得无法调试。我不知道这段代码有什么问题。

我可以在这里添加任何内容来帮助确定问题所在吗?这是一种奇怪的Swift / Xcode错误吗?

编辑:我确实尝试清除DerivedData并运行Clean。

编辑2:我无法解决这个问题。我上面的示例代码中确实有一些拼写错误,但它们与手头的问题无关。出于某种原因Bool表现得像setValue,只是退出函数而没有错误。我已经退回到明确设置这样的值:

return

2 个答案:

答案 0 :(得分:0)

而不是

var isOnboarded: Bool?

var isOnboarded: Bool = false

还要确保您的字典结构如下:

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

因为我认为你可能正在设置" isOnboarding"除了布尔之外的其他东西,它只是退出,因为

if let boolValue = value as? Bool 

返回false

告诉我这是怎么回事

答案 1 :(得分: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)