使用 SwiftUI 选择器,我的 MacBook 温度高达 50 度
Used SwiftUI picker and my MacBook heats up to 50 degrees
一使用代码,我的 MacBook 就会升温至 50 度。我有 4 个枚举,每个枚举都有一个选择器,一旦我将 3 个选择器放入 if-else 语句中然后进行调试,我的 MacBook 就会发热太多,以至于我几乎无法再触摸它了。
错误 ->
编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式
我将枚举与协议 Int16、Hashable、CaseIterable 结合使用。
我想要 Int16 作为我的 CoreData 属性。
如果我将 Int16 更改为 Int,则代码有效。
我将 "Taggs" 转换为 int 这样我就可以使用 else if statemant.
Import SwiftUI
struct EnumsInEnums: View {
@State var pickMain = 0
@State var pickA = 0
@State var pickB = 0
@State var pickC = 0
enum MainEnum : Int16, Hashable, CaseIterable
{
case AEnum
case BEnum
case CEnum
var name: String { return "\(self)" }
}
enum AEnum : Int16, Hashable, CaseIterable
{
case Aa
case Ba
case Ca
var name: String { return "\(self)" }
}
enum BEnum : Int16, Hashable, CaseIterable
{
case Ab
case Bb
case Cb
var name: String { return "\(self)" }
}
enum CEnum : Int16, Hashable, CaseIterable
{
case Ac
case Bc
case Cc
var name: String { return "\(self)" }
}
var body: some View {
NavigationView {
Form {
Section {
Picker(selection: $pickMain, label: Text("Pick \(pickMain)")) {
ForEach(MainEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
if pickMain == 0 {
Picker(selection: $pickA, label: Text("Pick \(pickA)")) {
ForEach(AEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
} else if pickMain == 1 {
Picker(selection: $pickB, label: Text("Pick \(pickB)")) {
ForEach(BEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
} else if pickMain == 2 {
Picker(selection: $pickC, label: Text("Pick \(pickC)")) {
ForEach(CEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
}
}
}
}
}
}
我希望 select Main,然后第二个选择器会向我显示 selected,就好像我 select 一个汽车制造商,第二个选择器会显示相应的汽车模型。
在 beta 5 中,ForEach 存在一个已知问题。来自发行说明:
Using a ForEach view with a complex expression in its closure can may
result in compiler errors. Workaround: Extract those expressions into
their own View types. (53325810)
你的ForEach视图,好像不太复杂,封装它的内容并不能解决问题。但是,如果您封装整个选择器就可以正常工作。仔细检查代码,因为我可能在封装时引入了错别字。
import SwiftUI
struct ContentView: View {
var body: some View {
EnumsInEnums()
}
}
struct EnumsInEnums: View {
@State var pickMain = 0
@State var pickA = 0
@State var pickB = 0
@State var pickC = 0
enum MainEnum : Int16, Hashable, CaseIterable
{
case AEnum
case BEnum
case CEnum
var name: String { return "\(self)" }
}
enum AEnum : Int16, Hashable, CaseIterable
{
case Aa
case Ba
case Ca
var name: String { return "\(self)" }
}
enum BEnum : Int16, Hashable, CaseIterable
{
case Ab
case Bb
case Cb
var name: String { return "\(self)" }
}
enum CEnum : Int16, Hashable, CaseIterable
{
case Ac
case Bc
case Cc
var name: String { return "\(self)" }
}
var body: some View {
NavigationView {
Form {
Section {
PickerMain(pickMain: $pickMain)
if pickMain == 0 {
PickerA(pickA: $pickA)
}
else if pickMain == 1 {
PickerB(pickB: $pickB)
} else if pickMain == 2 {
PickerC(pickC: $pickC)
}
}
}
}
}
struct PickerMain: View {
@Binding var pickMain: Int
var body: some View {
Picker(selection: $pickMain, label: Text("Pick \(pickMain)")) {
ForEach(MainEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
}
}
struct PickerA: View {
@Binding var pickA: Int
var body: some View {
Picker(selection: $pickA, label: Text("Pick \(pickA)")) {
ForEach(AEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
}
}
struct PickerB: View {
@Binding var pickB: Int
var body: some View {
Picker(selection: $pickB, label: Text("Pick \(pickB)")) {
ForEach(BEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
}
}
struct PickerC: View {
@Binding var pickC: Int
var body: some View {
Picker(selection: $pickC, label: Text("Pick \(pickC)")) {
ForEach(CEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
}
}
}
一使用代码,我的 MacBook 就会升温至 50 度。我有 4 个枚举,每个枚举都有一个选择器,一旦我将 3 个选择器放入 if-else 语句中然后进行调试,我的 MacBook 就会发热太多,以至于我几乎无法再触摸它了。 错误 ->
编译器无法在合理的时间内对该表达式进行类型检查;尝试将表达式分解为不同的子表达式
我将枚举与协议 Int16、Hashable、CaseIterable 结合使用。 我想要 Int16 作为我的 CoreData 属性。 如果我将 Int16 更改为 Int,则代码有效。 我将 "Taggs" 转换为 int 这样我就可以使用 else if statemant.
Import SwiftUI
struct EnumsInEnums: View {
@State var pickMain = 0
@State var pickA = 0
@State var pickB = 0
@State var pickC = 0
enum MainEnum : Int16, Hashable, CaseIterable
{
case AEnum
case BEnum
case CEnum
var name: String { return "\(self)" }
}
enum AEnum : Int16, Hashable, CaseIterable
{
case Aa
case Ba
case Ca
var name: String { return "\(self)" }
}
enum BEnum : Int16, Hashable, CaseIterable
{
case Ab
case Bb
case Cb
var name: String { return "\(self)" }
}
enum CEnum : Int16, Hashable, CaseIterable
{
case Ac
case Bc
case Cc
var name: String { return "\(self)" }
}
var body: some View {
NavigationView {
Form {
Section {
Picker(selection: $pickMain, label: Text("Pick \(pickMain)")) {
ForEach(MainEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
if pickMain == 0 {
Picker(selection: $pickA, label: Text("Pick \(pickA)")) {
ForEach(AEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
} else if pickMain == 1 {
Picker(selection: $pickB, label: Text("Pick \(pickB)")) {
ForEach(BEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
} else if pickMain == 2 {
Picker(selection: $pickC, label: Text("Pick \(pickC)")) {
ForEach(CEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
}
}
}
}
}
}
我希望 select Main,然后第二个选择器会向我显示 selected,就好像我 select 一个汽车制造商,第二个选择器会显示相应的汽车模型。
在 beta 5 中,ForEach 存在一个已知问题。来自发行说明:
Using a ForEach view with a complex expression in its closure can may result in compiler errors. Workaround: Extract those expressions into their own View types. (53325810)
你的ForEach视图,好像不太复杂,封装它的内容并不能解决问题。但是,如果您封装整个选择器就可以正常工作。仔细检查代码,因为我可能在封装时引入了错别字。
import SwiftUI
struct ContentView: View {
var body: some View {
EnumsInEnums()
}
}
struct EnumsInEnums: View {
@State var pickMain = 0
@State var pickA = 0
@State var pickB = 0
@State var pickC = 0
enum MainEnum : Int16, Hashable, CaseIterable
{
case AEnum
case BEnum
case CEnum
var name: String { return "\(self)" }
}
enum AEnum : Int16, Hashable, CaseIterable
{
case Aa
case Ba
case Ca
var name: String { return "\(self)" }
}
enum BEnum : Int16, Hashable, CaseIterable
{
case Ab
case Bb
case Cb
var name: String { return "\(self)" }
}
enum CEnum : Int16, Hashable, CaseIterable
{
case Ac
case Bc
case Cc
var name: String { return "\(self)" }
}
var body: some View {
NavigationView {
Form {
Section {
PickerMain(pickMain: $pickMain)
if pickMain == 0 {
PickerA(pickA: $pickA)
}
else if pickMain == 1 {
PickerB(pickB: $pickB)
} else if pickMain == 2 {
PickerC(pickC: $pickC)
}
}
}
}
}
struct PickerMain: View {
@Binding var pickMain: Int
var body: some View {
Picker(selection: $pickMain, label: Text("Pick \(pickMain)")) {
ForEach(MainEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
}
}
struct PickerA: View {
@Binding var pickA: Int
var body: some View {
Picker(selection: $pickA, label: Text("Pick \(pickA)")) {
ForEach(AEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
}
}
struct PickerB: View {
@Binding var pickB: Int
var body: some View {
Picker(selection: $pickB, label: Text("Pick \(pickB)")) {
ForEach(BEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
}
}
struct PickerC: View {
@Binding var pickC: Int
var body: some View {
Picker(selection: $pickC, label: Text("Pick \(pickC)")) {
ForEach(CEnum.allCases, id: \.self){ x in
Text("\(x.name)").tag(Int(x.rawValue))
}
}
}
}
}