我正在使用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
可以正常使用profilePictureURL
和contextId
。但是,一旦它达到setValue
isOnboarded
的{{1}},它就会将我的函数存在,就好像它是Bool
语句一样。没有错误,调试窗口中没有任何内容。我在该行上设置了断点,验证return
实际上是作为boolVal
键入,并尝试跳过该行。然后XCode突破该类,从不设置该var,并在下一个断点(在另一个类中)停止。它只是退出功能。这很奇怪。
如果出现错误,我希望XCode以某种方式通知我。只是将执行跳转到下一个断点使得无法调试。我不知道这段代码有什么问题。
我可以在这里添加任何内容来帮助确定问题所在吗?这是一种奇怪的Swift / Xcode错误吗?
编辑:我确实尝试清除DerivedData并运行Clean。
编辑2:我无法解决这个问题。我上面的示例代码中确实有一些拼写错误,但它们与手头的问题无关。出于某种原因Bool
表现得像setValue
,只是退出函数而没有错误。我已经退回到明确设置这样的值:
return
答案 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)