Skip to content

结构体与枚举

在 .slint 源文件顶层的 struct 声明定义具名结构体类型; 其字段写在花括号之间,每个字段是由 : 分隔的名字和类型, 字段之间用逗号分隔,允许没有字段的结构体。 {#sls.struct.decl}

每个字段的类型可以是任何属性类型。 {#sls.struct.field-type}

export struct Palette {
fill: color,
gap: length,
}
slint

字段之间的 ; 会构成编译错误;编译器会提示你改用 ,。

结构体可以带有一个或多个 @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;
}
slint

结构体字面量不必列出每个字段;省略的字段取其默认值, 而不指向目标结构体字段的成员会被忽略。 {} 完全不列出字段,因此每个字段都取其默认值。

结构体的默认值将每个字段设置为其自身的默认值,除非该字段声明了自己的默认值。

字段类型后面的 = 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" };
}
slint

该表达式必须是编译时常量。 它可以组合字面量、类型转换和运算符,但引用属性、元素或任何运行时值 会构成编译错误。 只有当结果在所有区域设置中都相同时,数字才会转换为字符串: = 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 };
}
slint

具有相同字段的两个匿名结构体类型是同一类型。 具名结构体永远只等于自身:它不能与字段相同的匿名结构体互换。

顶层的 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;
}
slint

枚举值通过用点分隔的枚举名和值名来引用, 例如 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);
}
slint

在比较中,只有右侧可以省略名字,因为右侧会取左侧的类型: card.suit == hearts 可行,但 hearts == card.suit 不可行,因为左侧操作数没有期望类型。


© 2026 SixtyFPS GmbH