Swift 元组作为 Swift 中的字典值 5
Swift Tuples as Dictionary Values in Swift 5
我有一个字典,其键为字符串类型,值为元组:
var dictionaryTuple = [String: (x: Double, y: Double)]()
如何设置和访问元组的值。这是我试过的
dictionaryTuple["One"].x = 5.5
- 编译器给出错误:可选类型的值 '(x: Double, y: Double)?'必须解包以引用包装基类型 '(x: Double, y: Double)' 的成员 'x',请参见下面的游乐场屏幕截图
不确定为什么编译器会出错。我没有将元组声明为可选的,也没有将字典声明为可选的
当我改为:
dictionaryTuple["One"]?.x = 5.5
- 编译器很高兴,但我没有得到任何回报
如果我把它改成:
dictionaryTuple["One"]!.x = 5.5
- 它崩溃了。
我做错了什么?我需要在使用元组之前对其进行初始化吗?如果是怎么办?
非常感谢!
为什么不这样构造你的结构?
struct DT {
let key: String
let x: Double
let y: Double
}
let dt = DT(key: "One", x: 1, y: 2)
如果你真的想要自己的方式,就像你的问题一样:
struct DT {
var dictionaryTuple = [String: (x: Double, y: Double)]()
}
var dt = DT(dictionaryTuple: ["One": (x: 1, y: 2)])
print(dt)//prints -> DT(dictionaryTuple: ["One": (x: 1.0, y: 2.0)])
var tuple: (x: Double, y: Double) = dt.dictionaryTuple["One"]!
tuple.x = 100
tuple.y = 200
//apply
dt.dictionaryTuple["One"] = tuple
print(dt)//prints -> DT(dictionaryTuple: ["One": (x: 100.0, y: 200.0)])
这里的关键是我显式声明了tuple
变量的类型,然后强制转换它。
您可以像这样插入一个元组
dictionaryTuple["One"] = (3.3, 4.4)
或更新现有的,但您需要将其视为可选。
dictionaryTuple["Two"]?.x = 5.5
或在更新时提供默认值。
dictionaryTuple["Three", default: (0.0, 0.0)].x = 5.5
执行这 3 个操作将意味着字典包含 2 个元组
var dictionaryTuple = [String: (x: Double, y: Double)]()
dictionaryTuple["One"] = (3.3, 4.4)
dictionaryTuple["Two"]?.x = 5.5
dictionaryTuple["Three", default: (0.0, 0.0)].x = 5.5
print(dictionaryTuple)
["Three": (x: 5.5, y: 0.0), "One": (x: 3.3, y: 4.4)]
我有一个字典,其键为字符串类型,值为元组:
var dictionaryTuple = [String: (x: Double, y: Double)]()
如何设置和访问元组的值。这是我试过的
dictionaryTuple["One"].x = 5.5
- 编译器给出错误:可选类型的值 '(x: Double, y: Double)?'必须解包以引用包装基类型 '(x: Double, y: Double)' 的成员 'x',请参见下面的游乐场屏幕截图
不确定为什么编译器会出错。我没有将元组声明为可选的,也没有将字典声明为可选的
当我改为:
dictionaryTuple["One"]?.x = 5.5
- 编译器很高兴,但我没有得到任何回报
如果我把它改成:
dictionaryTuple["One"]!.x = 5.5
- 它崩溃了。
我做错了什么?我需要在使用元组之前对其进行初始化吗?如果是怎么办?
非常感谢!
为什么不这样构造你的结构?
struct DT {
let key: String
let x: Double
let y: Double
}
let dt = DT(key: "One", x: 1, y: 2)
如果你真的想要自己的方式,就像你的问题一样:
struct DT {
var dictionaryTuple = [String: (x: Double, y: Double)]()
}
var dt = DT(dictionaryTuple: ["One": (x: 1, y: 2)])
print(dt)//prints -> DT(dictionaryTuple: ["One": (x: 1.0, y: 2.0)])
var tuple: (x: Double, y: Double) = dt.dictionaryTuple["One"]!
tuple.x = 100
tuple.y = 200
//apply
dt.dictionaryTuple["One"] = tuple
print(dt)//prints -> DT(dictionaryTuple: ["One": (x: 100.0, y: 200.0)])
这里的关键是我显式声明了tuple
变量的类型,然后强制转换它。
您可以像这样插入一个元组
dictionaryTuple["One"] = (3.3, 4.4)
或更新现有的,但您需要将其视为可选。
dictionaryTuple["Two"]?.x = 5.5
或在更新时提供默认值。
dictionaryTuple["Three", default: (0.0, 0.0)].x = 5.5
执行这 3 个操作将意味着字典包含 2 个元组
var dictionaryTuple = [String: (x: Double, y: Double)]()
dictionaryTuple["One"] = (3.3, 4.4)
dictionaryTuple["Two"]?.x = 5.5
dictionaryTuple["Three", default: (0.0, 0.0)].x = 5.5
print(dictionaryTuple)
["Three": (x: 5.5, y: 0.0), "One": (x: 3.3, y: 4.4)]