使用 Swift,从 plist 加载数据时如何区分布尔值和整数值?
Using Swift, how can I tell the difference between a boolean and integer value when loading data from a plist?
我的应用程序需要能够读取 plist 文件并知道数据的类型,因此我创建了一个函数来确定对象的类型:
func getTypeOfObject(object: AnyObject) -> String {
if object as? [String:AnyObject] != nil {
return "dict"
} else if object as? [AnyObject] != nil {
return "array"
} else if object as? Bool != nil {
return "bool"
} else if object as? Int != nil {
return "int"
} else if object as? String != nil {
return "string"
} else {
return ""
}
}
问题是,如果我在数字上调用该函数,我会返回 "bool"。
如果我更改函数以首先检查数字,我会在传递布尔值时返回 "int"。
这似乎是因为当我从 plist 文件中的数据创建字典时,布尔值被赋予一个整数值(1 表示真,0 表示假)。
有什么办法可以解决这个问题吗?
你不能 - 除非你想自己解析 plist XML。返回的值将是 NSNumber,您可以决定是否将其视为 bool(通过 NSNumber 的 boolValue)。
我做了更多研究并决定使用 CFPropertyList
,它解决了我的问题,因为布尔值是 CFBooleanRef
,而不是 NSNumber
。
如果有人想要实际代码,请在评论中询问。现在有点乱,所以我没有马上发布。
我的应用程序需要能够读取 plist 文件并知道数据的类型,因此我创建了一个函数来确定对象的类型:
func getTypeOfObject(object: AnyObject) -> String {
if object as? [String:AnyObject] != nil {
return "dict"
} else if object as? [AnyObject] != nil {
return "array"
} else if object as? Bool != nil {
return "bool"
} else if object as? Int != nil {
return "int"
} else if object as? String != nil {
return "string"
} else {
return ""
}
}
问题是,如果我在数字上调用该函数,我会返回 "bool"。 如果我更改函数以首先检查数字,我会在传递布尔值时返回 "int"。
这似乎是因为当我从 plist 文件中的数据创建字典时,布尔值被赋予一个整数值(1 表示真,0 表示假)。
有什么办法可以解决这个问题吗?
你不能 - 除非你想自己解析 plist XML。返回的值将是 NSNumber,您可以决定是否将其视为 bool(通过 NSNumber 的 boolValue)。
我做了更多研究并决定使用 CFPropertyList
,它解决了我的问题,因为布尔值是 CFBooleanRef
,而不是 NSNumber
。
如果有人想要实际代码,请在评论中询问。现在有点乱,所以我没有马上发布。