Swift从字典中提取数值

Swift从字典中提取数值,swift,dictionary,numeric,type-conversion,Swift,Dictionary,Numeric,Type Conversion,我需要从字典中提取数据(NSXMLParser中的属性,但我认为这并不重要)。下面的方法可行,但这真的是最“简单”的方法吗?该属性可能存在于字典中,也可能不存在于字典中。该属性的值可以转换为整数,也可以不转换为整数(即toInt()返回可选值)。'“mandatory”是Bool,“minimumLength”是Int,是类属性 func decodeDataRestrictions(#attributeDictionary: [NSObject: AnyObject]!) { var st

我需要从字典中提取数据(NSXMLParser中的属性,但我认为这并不重要)。下面的方法可行,但这真的是最“简单”的方法吗?该属性可能存在于字典中,也可能不存在于字典中。该属性的值可以转换为整数,也可以不转换为整数(即toInt()返回可选值)。'“mandatory”是Bool,“minimumLength”是Int,是类属性

  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兼容。