结构体与枚举
在 .slint 源文件顶层的 struct 声明定义具名结构体类型;
其字段写在花括号之间,每个字段是由 : 分隔的名字和类型,
字段之间用逗号分隔,允许没有字段的结构体。 {#sls.struct.decl}
每个字段的类型可以是任何属性类型。 {#sls.struct.field-type}
export struct Palette { fill: color, gap: length,}字段之间的 ; 会构成编译错误;编译器会提示你改用 ,。
结构体可以带有一个或多个 @rust-attr(...) 属性作为前缀,并且可以被 export。
声明与已定义类型同名的结构体会替换先前的类型,并发出警告。
结构体值写作按名字初始化字段的结构体字面量,
{ field1: value1, field2: value2 },可带可选的尾随逗号。 {#sls.struct.literal}
字段用 . 运算符读取,例如 palette.fill。 {#sls.struct.field-access}
export struct Palette { fill: color, gap: length,}
export component Example inherits Window { out property <Palette> palette: { fill: #f00, gap: 2px }; out property <color> tint: palette.fill;}结构体字面量不必列出每个字段;省略的字段取其默认值,
而不指向目标结构体字段的成员会被忽略。
{} 完全不列出字段,因此每个字段都取其默认值。
结构体的默认值将每个字段设置为其自身的默认值,除非该字段声明了自己的默认值。
字段类型后面的 = expression 为该字段声明默认值:
export struct Player { name: string = "unknown", score: int = 100,}
export component Example { // player.name is "Foo", player.score is 100 in-out property<Player> player: { name: "Foo" };}该表达式必须是编译时常量。
它可以组合字面量、类型转换和运算符,但引用属性、元素或任何运行时值
会构成编译错误。
只有当结果在所有区域设置中都相同时,数字才会转换为字符串:
= 42 没问题,而 = 42.1 会构成编译错误,因为小数分隔符取决于区域设置。
只要创建结构体实例时没有为该字段提供值,就会应用默认值:
在省略该字段的结构体字面量中、在从未设置过该结构体类型的属性中,
以及从原生代码构造该结构体时
(Rust Player::default()、C++ Player{}、JavaScript new ui.Player()、Python ui.Player())。
字段默认值仅在具名结构体声明中受支持。
在匿名结构体类型中书写 = expression 会构成编译错误。
{ identifier1: type1, identifier2: type2 } 是匿名结构体类型。
它的行为类似于没有名字的具名结构体:
export component Example { in-out property<{name: string, score: int}> player: { name: "Foo", score: 100 }; in-out property<{a: int, }> foo: { a: 3 };}具有相同字段的两个匿名结构体类型是同一类型。 具名结构体永远只等于自身:它不能与字段相同的匿名结构体互换。
顶层的 enum 声明定义枚举;
其值列在花括号之间,以逗号分隔。 {#sls.enum.decl}
枚举应至少有一个值。 {#sls.enum.nonempty}
值不应与枚举同名。 {#sls.enum.value-name}
各个值应互不相同;在名字中 - 和 _ 是相同的字符,
因此 hello-world 和 hello_world 命名同一个值。 {#sls.enum.distinct}
任何两个值都不应映射到相同的生成名字,该名字通过去掉 - 和 _
并将名字的首字母以及分隔符后每个单词的首字母大写而形成。
hello-world 和 HelloWorld 是不同的值,但映射到同一个名字,
因此枚举不能同时声明两者。 {#sls.enum.name-collision}
export enum Direction { up, down, left, right }
export component Example inherits Window { in-out property<Direction> heading: Direction.up;}枚举值通过用点分隔的枚举名和值名来引用,
例如 Direction.up。 {#sls.enum.value}
枚举的默认值是其第一个值。 {#sls.enum.default}
只要期望的类型是该枚举类型的值,就可以省略枚举名: 在绑定、结构体字段、数组元素、函数或回调参数以及返回值中。
export enum CardSuit { clubs, diamonds, hearts, spade }export struct Card { suit: CardSuit, value: int }
export component Example { // in a struct field and an array element out property<Card> card: { suit: hearts, value: 10 }; out property<[CardSuit]> deck: [clubs, diamonds, hearts, spade];
pure function is-red(suit: CardSuit) -> bool { return suit == hearts || suit == diamonds; } // as a function argument out property<bool> spade-is-red: is-red(spade);}在比较中,只有右侧可以省略名字,因为右侧会取左侧的类型:
card.suit == hearts 可行,但 hearts == card.suit 不可行,因为左侧操作数没有期望类型。
© 2026 SixtyFPS GmbH