Swift 从字典中提取数值
Swift Extract Numeric Value from Dictionary
我需要从字典中提取数据(来自 NSXMLParser 的属性,但我认为这不重要)。下面是可行的,但这真的是 "easiest" 为什么要这样做吗?该属性可能存在也可能不存在于字典中。属性的值可能会或可能不会转换为整数(即 toInt() returns 可选)。 'mandatory' 是 Bool,'minimumLength' 是 Int 并且是 class 属性。
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 则使用该值,那么 if let
将这两者结合起来,如果不是,则将局部变量设置为未包装的值-零。这就是 minimumLength
所发生的事情,以及一些可选的链接(即,如果该值不是 nil,则继续执行 toInt()
else nil)。
在 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 的情况下从右侧替换默认值。
你应该使用 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
键的值是否存在,第二个验证该值是否可转换为整数。
我需要从字典中提取数据(来自 NSXMLParser 的属性,但我认为这不重要)。下面是可行的,但这真的是 "easiest" 为什么要这样做吗?该属性可能存在也可能不存在于字典中。属性的值可能会或可能不会转换为整数(即 toInt() returns 可选)。 'mandatory' 是 Bool,'minimumLength' 是 Int 并且是 class 属性。
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 则使用该值,那么 if let
将这两者结合起来,如果不是,则将局部变量设置为未包装的值-零。这就是 minimumLength
所发生的事情,以及一些可选的链接(即,如果该值不是 nil,则继续执行 toInt()
else nil)。
在 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 的情况下从右侧替换默认值。
你应该使用 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
键的值是否存在,第二个验证该值是否可转换为整数。