Swift从Dictionary中提取数值

时间:2015-04-08 19:08:18

标签: swift dictionary numeric type-conversion

我需要从字典中提取数据(来自NSXMLParser的属性,但我不认为这很重要)。以下工作,但这真的是最简单的"为什么要这样做?该属性可能存在于字典中,也可能不存在。属性的值可能会也可能不会转换为整数(即​​toInt()返回一个可选项)。 '强制性'是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]];      
}

2 个答案:

答案 0 :(得分:2)

您应该能够按如下方式编写整个函数:

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-ness的可选项,然后使用该值(如果它不是nil),那么if let将这两项结合起来,如果非零,则将局部变量设置为未包装的值。这就是minimumLength发生的事情,以及一些可选的链接(即如果值为非零,则继续执行toInt()其他为零。)

如果是mandatory,您可以将可选值与非==的非可选值进行比较,因此根本不需要检查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-coalescing运算符,如果左侧为nil,则替换右侧的默认值。

答案 1 :(得分:1)

您应该使用optional binding - 第一次提取可以简单地写为:

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

第一个if验证mandatory密钥的值是否存在,第二个验证该值是否可转换为整数。

相关问题