【问题标题】:Swift: Accessing properties in a dictionary of structsSwift:访问结构字典中的属性
【发布时间】:2015-06-09 14:42:28
【问题描述】:

如果我创建一个结构数组,一切都会按预期工作,但是如果我创建一个结构字典,它们的属性将不再可访问,是否有额外的步骤来访问它们?请看下面的简单示例:

struct SceneStruct {
   var number: Int

   init(number: Int) {
       self.number = number
   }
}
let aStruct = SceneStruct(number: 0)  //shows in assistant editor as:  {number 0}
let bStruct = SceneStruct(number: 26) //shows in assistant editor as: {number 26}

//EXPECTED BEHAVIOR:
let arr = [aStruct,bStruct] //shows in assistant editor as: [{number 0}, {number 26}]
var i = arr[0] //shows in assistant editor as: {number 0}
var j = i.number //shows in assistant editor as: 0

//BROKEN BEHAVIOR:
let dict = ["one": aStruct, "two": bStruct] //shows in assistant editor as: ["one": {number 0}, "two": {number 26}]
var x = dict["one"] //shows in assistant editor as: {{number 0}}
var y = x.number // Fails: "error: 'SceneStruct?' does not have a member named 'number'"

似乎对象以某种方式包装在字典中,但对于我来说,我找不到任何关于这种行为的信息。

【问题讨论】:

    标签: swift dictionary struct properties


    【解决方案1】:

    对于数组,下标运算符返回值。

    var i = arr[0] // <- i is of type SceneStruct
    

    对于字典,下标运算符返回一个可选值。

    var x = dict["one"] // <- x is of type SceneStruct? (Optional< SceneStruct>)
    

    原因是arr[100] 抛出异常,因为数组越界。而dict["invalid"] 返回nil 查找失败。

    您可以通过几种方式解决这种差异。

    使用默认值进行评估

    var defaultValue = SceneStruct(number: 0)
    var x = dict["one"] ?? defaultValue // provide a default value if dict["one"] is nil.
    var y = x.number
    

    条件评估

    if let x = dict["one"] { // conditionally set x
        var y = x.number
    } else {
        // dict["one"] is nil
    }
    

    强制解包

    var x = dict["one"]! // force unwrap dict["one"], this will throw an exception if dict["one"] is nil. 
    var y = x.number
    

    【讨论】:

    • 该死的选项 ;) 谢谢——正如我所想,这是一个非常简单的答案。
    【解决方案2】:

    通过键为字典值下标的结果是一个可选值(在您的情况下为SceneStruct?)。你需要处理那个可选的。

    let dict = ["one": aStruct, "two": bStruct]
    let x = dict["one"] // x is SceneStruct?
    let y = x?.number // y is Int?
    

    【讨论】:

      猜你喜欢
      • 2020-03-15
      • 2016-10-26
      • 2017-07-20
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      相关资源
      最近更新 更多