Swift从字典中提取数值
我需要从字典中提取数据(NSXMLParser中的属性,但我认为这并不重要)。下面的方法可行,但这真的是最“简单”的方法吗?该属性可能存在于字典中,也可能不存在于字典中。该属性的值可以转换为整数,也可以不转换为整数(即toInt()返回可选值)。'“mandatory”是Bool,“minimumLength”是Int,是类属性Swift从字典中提取数值,swift,dictionary,numeric,type-conversion,Swift,Dictionary,Numeric,Type Conversion,我需要从字典中提取数据(NSXMLParser中的属性,但我认为这并不重要)。下面的方法可行,但这真的是最“简单”的方法吗?该属性可能存在于字典中,也可能不存在于字典中。该属性的值可以转换为整数,也可以不转换为整数(即toInt()返回可选值)。'“mandatory”是Bool,“minimumLength”是Int,是类属性 func decodeDataRestrictions(#attributeDictionary: [NSObject: AnyObject]!) { var st
func decodeDataRestrictions(#attributeDictionary: [NSObject: AnyObject]!) {
var stringValue: String?
var intValue: Int?
// Extract data restrictions from the element attributes
self.mandatory = false
stringValue = attributeDictionary["mandatory"] as String?
if stringValue != nil {
if stringValue! == "true" {
self.mandatory = true
}
}
self.minimumLength = 1
stringValue = attributeDictionary["minimumLength"] as String?
if stringValue != nil {
intValue = stringValue!.toInt()
if intValue != nil {
self.minimumLength = intValue!
}
}
在Objective-C中,这要容易得多:
self.mandatory = NO;
if ([[attributeDict objectForKey:@"mandatory"] isEqualToString:@"true"]) {
self.mandatory = YES;
}
self.minimumLength = 1;
if ([attributeDict objectForKey:@"minimumLength"] != nil) {
self.minimumLength = [NSNumber numberWithInteger:[[attributeDict objectForKey:@"minimumLength"] integerValue]];
}
您应该能够按照如下方式编写整个函数:
func decodeDataRestrictions(#attributeDictionary: [NSObject: AnyObject]!) {
if (attributeDictionary["mandatory"] as? String) == "true" {
self.mandatory == true
}
if let minimumLength = (attributeDictionary["minimumLength"] as? String)?.toInt() {
self.minimumLength = minimumLength
}
}
如果需要检查一个可选值是否为nil,然后如果该值不是nil,则使用该值,如果让组合这两个值,如果非nil,则将局部变量设置为未包装值。这就是minimumLength
所发生的情况,以及一些可选的链接(即,如果值为非nil,则继续执行toInt()
else nil)
在强制
的情况下,您可以使用=
将可选值与非可选值进行比较,因此根本不需要检查nil
编辑:阅读了Objective-C版本后,如果您愿意在缺少字典数据的情况下默认self
值,您可以进一步简化它,就像您在那里做的那样:
func decodeDataRestrictions(#attributeDictionary: [NSObject: AnyObject]!) {
self.mandatory = (attributeDictionary["mandatory"] as? String) == "true"
self.minimumLength = (attributeDictionary["minimumLength"] as? String)?.toInt() ?? 1
}
minimumLength
版本使用nil合并运算符,如果左侧为nil,则该运算符将替换右侧的默认值。您应该使用-第一次提取可以简单地写成:
if let mandatory = attributeDictionary["mandatory"] as? String {
self.mandatory = mandatory == "true"
}
鉴于第二项要求额外检查:
if let minLen = attributeDictionary["minimumLength"] as String? {
if let minLen = minLen.toInt() {
self.minimumLength = minLen
}
}
第一个
如果验证强制键的值是否存在,第二个验证该值是否可转换为整数。空速的答案很棒,谢谢。我能够从45 LOC变为6 LOC(我解码了6个值)。此外,它还与Swift 1.2兼容。