Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift字典中递增或初始化整数的最佳方法_Swift - Fatal编程技术网

在Swift字典中递增或初始化整数的最佳方法

在Swift字典中递增或初始化整数的最佳方法,swift,Swift,给定一个目录和一个键,如果字典中存在该键,我想增加该键的值,或者将其初始化为1 dictionary类型是dictionary,但根据设计,此键的值类型将始终为Int,因为它只能由此代码更改 到目前为止,我的代码如下所示,但我希望以swift风格对其进行优化 let v = dict[key] as? Int if v != nil { dict[key] = v! + 1 } else { dict[key] = 1 } 更新 自Swift 4以来,您可以在下标中使用默认值(

给定一个目录和一个键,如果字典中存在该键,我想增加该键的值,或者将其初始化为1

dictionary类型是dictionary,但根据设计,此键的值类型将始终为Int,因为它只能由此代码更改

到目前为止,我的代码如下所示,但我希望以swift风格对其进行优化

let v = dict[key] as? Int
if v != nil {
    dict[key] = v! + 1
} else {
    dict[key] = 1
}

更新

自Swift 4以来,您可以在下标中使用默认值(假设字典具有
值==Int
):

您可以在下面的Swift Evolution提案中了解更多信息


一种方法是使用nil凝聚运算符:

dict[key] = ((dict[key] as? Int) ?? 0) + 1
如果您知道字典的类型,您几乎可以执行相同的操作,但无需强制转换:

dict[key] = (dict[key] ?? 0) + 1
说明

此运算符(
??
)在左侧取一个可选值,在右侧取一个非可选值,如果可选值不是
nil
,则返回可选值。否则,它将返回正确的值作为默认值

就像这个三元运算符表达式:

dict[key] ?? 0
// is equivalent to
dict[key] != nil ? dict[key]! : 0

更具可读性的swift样式是:

if let v = dict[key] as? Int {
    dict[key] = v + 1
} else {
    dict[key] = 0
}
您可以尝试以下方法:

dict[key, default:0] += 1
当执行
dict[key,default:0]+=1
时,key的值不是key-in-key,指定的默认值(0)从下标返回,递增,然后添加到该键下的字典中


我想是右手边的??也可能是可选的,因此结果将是可选的,如果没有??那么结果就是零。对于(第一选择??第二选择??第三选择??默认值)@gnasher729这样的事情很方便,你是对的。因为操作符重载了一个版本,该版本在右侧接受一个可选的。
dict[key, default:0] += 1