Swift 3/4中定义值为数组的字典:语法纠错及写法咨询
在Swift 3/4中定义[String: 数组]类型字典的正确写法
嘿,这个歧义问题其实是Swift类型推断的小“脾气”——当你直接写空字典[:]时,编译器没法确定数组里具体存的是什么类型的元素,所以就懵了!下面给你几种正确的写法,覆盖简写和完整语法:
1. 最常用的简写语法(明确类型)
直接在变量声明时指定完整的字典类型,告诉编译器键是String,值是特定元素类型的数组:
// 如果数组存的是字符串 var stringArrayDict: [String: [String]] = [:] // 如果数组存的是整数 var intArrayDict: [String: [Int]] = [:] // 如果数组可以存任意类型(不推荐,尽量用具体类型) var anyArrayDict: [String: [Any]] = [:]
这样编译器就不会有歧义了,因为你把每个部分的类型都明明白白告诉它了。
2. 完整结构体写法
如果你更喜欢用Dictionary结构体的完整语法,也可以这么写:
// 写法一:显式指定类型后初始化空字典 var dict1: Dictionary<String, [Double]> = Dictionary() // 写法二:直接在初始化时指定类型 var dict2 = Dictionary<String, [Bool]>()
这种写法和简写本质是一样的,只是更“啰嗦”一点,适合刚开始学Swift的时候加深理解。
3. 初始化时带元素,让Swift自动推断
如果你的字典一开始就有初始值,那完全可以让Swift自己推断类型,不用手动指定:
// 编译器会自动推断这是 [String: [String]] 类型的字典 var fruitDict = [ "red": ["apple", "strawberry"], "yellow": ["banana", "lemon"] ] // 后续还能正常添加新的键值对 fruitDict["green"] = ["kiwi", "watermelon"]
这种写法最简洁,只要初始值的类型统一,编译器就不会犯迷糊。
为什么会出现“ambiguous expression”错误?
当你只写var dict = [:]时,Swift既不知道键的类型,也不知道值(数组)里元素的类型,它有无数种可能的类型组合,所以就会抛出歧义错误。解决的核心就是给编译器足够的类型信息——要么提前指定完整类型,要么用初始值让它自动推断。
内容的提问来源于stack exchange,提问作者ajayramesh
相关产品推荐
相关产品推荐

