Swift嵌套结构--如何访问元素

Swift嵌套结构--如何访问元素,swift,struct,nested,Swift,Struct,Nested,在一个Swift应用程序中,我试图嵌套结构以获得更高的清晰度。代码如下: struct ColorStruct { var colorname: String = "" struct RGB { var red: Int = 0 var green: Int = 0 var blue: Int = 0 } } 我可以访问ColorStruct元素(例如:“colorname”),只要它不是嵌套的 问:关于如何正确访问

在一个Swift应用程序中,我试图嵌套结构以获得更高的清晰度。代码如下:

struct ColorStruct {
    var colorname: String = ""
    struct RGB {
        var red:   Int = 0
        var green: Int = 0
        var blue:  Int = 0
    }
}
我可以访问
ColorStruct
元素(例如:“colorname”),只要它不是嵌套的

问:关于如何正确访问“red”变量,我没有理解什么

var newColor = ColorStruct()
newColor.colorname = "Red"
newColor.RGB.red   = 255     // Results in error:
// Static member 'RGB' cannot be used on instance of type `ColorStruct`

您可以通过以下方式实现:

struct ColorStruct {
var colorname:String  = ""
var colorValue: RGB!

struct RGB              {
    var red:            Int    = 0
    var green:          Int    = 0
    var blue:           Int    = 0

    mutating func setRed(value: Int) {
        self.red = value
    }
    mutating func setGreen(value: Int) {
        self.green = value
    }
    mutating func setBlue(value: Int) {
        self.blue = value
    }
}
}
然后将结构用作:

var color = ColorStruct()

color.colorname = "blue"
color.colorValue = ColorStruct.RGB.init(red: 0, green: 0, blue: 1)
print(color.colorValue)
如果要更改值,请调用以下命令:

color.colorValue.setRed(value: 2)
print(color.colorValue)

希望它有帮助

问题代码中给出的嵌套结构不会自动创建该类型的外部结构成员。要实现这一点,请通过以下方式细化代码:

struct ColorStruct {
  var colorname: String = ""
  struct RGB {
    var red:   Int = 0
    var green: Int = 0
    var blue:  Int = 0
  }

  var rgb = RGB()
}

var color = ColorStruct()
color.rgb.red = 255

您必须实例化您的
RGB
struct,而不是
ColorStruct

struct ColorStruct {
    var colorname:String    = ""
    struct RGB              {
        var red:            Int    = 0
        var green:          Int    = 0
        var blue:           Int    = 0
    }
}

var newColor = ColorStruct.RGB()
newColor.red = 255

不能像这样给struct赋值。或者像这样创建RGB的新属性

struct ColorStruct {
  var colorname:String    = ""
  var rgb = RGB()

  struct RGB {
    var red:            Int    = 0
    var green:          Int    = 0
    var blue:           Int    = 0
  }

}

var newColor = ColorStruct()
newColor.colorname = "Red"
newColor.rgb.red   = 255     // Results in error:
或者,在ColorStruct中设置静态变量

struct ColorStruct {
  var colorname:String    = ""
  static var rgb = RGB()

  struct RGB {
    var red:            Int    = 0
    var green:          Int    = 0
    var blue:           Int    = 0
  }
}

ColorStruct.rgb.red = 255
这一行:

struct RGB{ var red: Int = 0}

表示red是
结构RGB
中的实例变量(换句话说,red确实属于RGB的实例)。当您创建ColorStruct类型的结构时,您不会创建一个结构RGB。如果已创建实例变量的对象,则只能访问该实例变量。如果要访问variabele red,请创建一个结构RGB(
RGB()
),或使variabele/struct(在Swift中可能吗?)静态(不要使其成为实例variabele)。

struct RGB{var red:Int=0;var green:Int=0;var blue:Int=0;};struct ColorStruct{var colorname:String=”“;var RGB:RGB;}
而不是?正如你所展示的,我使用了单独的结构,但我的观点是,为了更清晰,我正在尝试嵌套结构。
ColorStruct
不知道
struct RGB
而不将
var RGB:RGB
添加到
ColorStruct
中。请注意,
var RGB:RGB
不会编译,因为类型名称和变量之间存在名称冲突谢谢,但尽管它确实有效,但(可以说)并不能提高清晰度。我的目标有两个:提高代码的清晰度,并理解代码不起作用的原因。@VicW。如果要使用和修改结构中的任何值,需要创建结构的对象(按值传递)。@VicW。谢谢你,麦克斯。您的回答实现了我的两个目标:理解原因和代码的清晰性。Sebastien,谢谢。这种方法的问题是,当封闭的ColorStruct具有多个嵌套结构时,随着其他嵌套结构的添加,实例化变得越来越复杂。