Swift中使用带值初始化器语法创建字典是否会报错?
Swift 字典初始化的语法问题
数组的两种有效初始化方式
创建数组时,字面量语法和初始化器语法都能正常工作:
var arr1: Array<Int> = [3, 4, 5] var arr2 = Array<Int>([3, 4, 5])
字典带值初始化的报错情况
但用带值的初始化器语法创建字典时会触发错误:
var dict1: Dictionary<Int, String> = [1: "aaa", 2: "bbb"] var dict2 = Dictionary<Int, String>([1: "aaa", 2: "bbb"]) // error var dict3 = [Int: String]([1: "aaa", 2: "bbb"]) // error
可行的替代方案
先通过无参初始化器创建空字典,再赋值就能解决这个问题:
var dict4 = Dictionary<Int, String>() dict4 = [1: "aaa", 2: "bbb"]
问题解答
是的,在Xcode 14.0.1环境下,使用Dictionary<Key, Value>([key: value, ...])这类带值的初始化器语法创建字典确实会返回错误。
原因在于:Swift的Array初始化器支持接收数组字面量(或者说数组字面量会被隐式转换为Array实例传入初始化器),但Dictionary并没有提供直接接收字典字面量作为参数的初始化器。
而var dict1: Dictionary<Int, String> = [1: "aaa", 2: "bbb"]能正常运行,是因为这是字面量赋值操作,Swift会直接将字典字面量转换为Dictionary实例,不属于初始化器调用的范畴。
内容的提问来源于stack exchange,提问作者Michael Knightly
相关产品推荐
相关产品推荐

