Swiftui 编译器无法在合理的时间内对此表达式进行类型检查,但我的视图不是太大
下面的文件每次都失败,它甚至不让我看到视图的预览。我知道发生了什么事。我已经退出Xcode,我已经清理了构建文件夹。我能想到的一切,我都做了。我正在使用Xcode版本12.2。有人有什么想法吗Swiftui 编译器无法在合理的时间内对此表达式进行类型检查,但我的视图不是太大,swiftui,Swiftui,下面的文件每次都失败,它甚至不让我看到视图的预览。我知道发生了什么事。我已经退出Xcode,我已经清理了构建文件夹。我能想到的一切,我都做了。我正在使用Xcode版本12.2。有人有什么想法吗 struct weatherToggle : Identifiable { let id = UUID() var value : Bool = false } struct Sliders : Identifiable { var id: UUID var perce
struct weatherToggle : Identifiable {
let id = UUID()
var value : Bool = false
}
struct Sliders : Identifiable {
var id: UUID
var percent: Double
var name: String
init( percent: Double, name: String ) {
self.id = UUID()
self.percent = percent
self.name = name
}
}
struct MyNodeView : View {
@Binding var myNode : Sliders
var body: some View {
HStack {
Text("\(String(format: "%.f", myNode.percent))%").font(.footnote)
Slider(value: $myNode.percent, in: 0 ... 100).padding()
}
}
}
struct OperatingConditionsView: View {
@State var selection: Int? = nil
let lightGray = Color(hue: 1.0, saturation: 0.0, brightness: 0.392)
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@State private var defensiveLayers = [Sliders]()
@State var sensorsAndSupports = [Sliders]()
// @Binding public var threats: [Any]
@State var availableLaunchPlatformSelections: [String] = []
@State var items = [weatherToggle(),
weatherToggle(),
weatherToggle()]
@State public var battery = "South Korea"
@State var atmosphericsSeverity = [String]()
@State var heliosphericsSeverity = [String]()
var conditions = ["light", "moderate", "severe"]
@State var heliospherics = [String]()
@State var atmospherics = [String]()
//@State var defensiveLayers = [String]()
@State var availableLaunchPlatforms = [String]()
//@State var sensorsAndSupport = [String]()
var body: some View {
ScrollView {
VStack(alignment: .leading) {
Text("OPERATING CONDITIONS").fontWeight(.bold)
.foregroundColor(Color(hue: 0.651, saturation: 1.0, brightness: 0.465))
.multilineTextAlignment(.center).padding(.vertical).frame(maxWidth: .infinity)
Button("load stored attack parameter set"){
}.padding(.leading, 30)
Text("ASSET READINESS").fontWeight(.bold).font(.subheadline)
.foregroundColor(Color(hue: 0.651, saturation: 1.0, brightness: 0.465))
.multilineTextAlignment(.center).padding(.vertical).frame(maxWidth: .infinity)
Group {
Text("Available launch platforms").fontWeight(.bold).foregroundColor(lightGray).padding(.vertical).padding(.leading, 30).font(.system(size: 15))
VStack {
List {
ForEach(availableLaunchPlatforms, id: \.self) { launchPlatform in
MultipleSelectionRow(title: launchPlatform, isSelected: self.availableLaunchPlatformSelections.contains(launchPlatform)) {
if self.availableLaunchPlatformSelections.contains(launchPlatform) {
self.availableLaunchPlatformSelections.removeAll(where: { $0 == launchPlatform })
}
else {
self.availableLaunchPlatformSelections.append(launchPlatform)
}
}.font(.custom("Gill Sans", size: 12)).foregroundColor(.gray)
}
}.frame(height: 250).font(.footnote)
}
}
Group {
Text("Other defensive layers").fontWeight(.bold).foregroundColor(lightGray).padding(.vertical).padding(.leading, 30).font(.system(size: 15))
HStack {
VStack {
ForEach(defensiveLayers.indices, id: \.self) { i in
Text(defensiveLayers[i].name).font(.custom("Gill Sans", size: 12)).padding(.trailing).foregroundColor(.gray).frame(maxHeight: .infinity)
}
}
VStack {
ForEach(defensiveLayers.indices, id: \.self) { i in
MyNodeView(myNode: $defensiveLayers[i])
}
}
}.padding(.horizontal, 30)
}
Group {
Text("Sensors & Support").fontWeight(.bold).foregroundColor(lightGray).padding(.vertical).padding(.leading, 30).font(.system(size: 15))
HStack {
VStack {
ForEach(sensorsAndSupports.indices, id: \.self) { i in
Text(sensorsAndSupports[i].name).font(.custom("Gill Sans", size: 12)).padding(.trailing).foregroundColor(.gray).frame(maxHeight: .infinity)
}
}
VStack {
ForEach(sensorsAndSupports.indices, id: \.self) { i in
MyNodeView(myNode: $sensorsAndSupports[i])
}
}
}.padding(.horizontal, 30)
}
Group {
Text("ATMOSPHERICS").fontWeight(.bold).font(.subheadline)
.foregroundColor(Color(hue: 0.651, saturation: 1.0, brightness: 0.465))
.multilineTextAlignment(.center).padding(.vertical).frame(maxWidth: .infinity)
ForEach(0 ..< atmospherics.count, id: \.self) { i in
HStack {
Menu {
ForEach(0 ..< conditions.count) { j in
Button(conditions[j]) {
atmosphericsSeverity[i] = conditions[j]
}
}
} label: {
Text(atmospherics[i])
Image(systemName: "cloud.drizzle")
}.frame(maxWidth: .infinity)
Text("Current: " + atmosphericsSeverity[i]).frame(maxWidth: .infinity).font(.footnote).foregroundColor(.gray)
}.padding()
.foregroundColor(.white).background(LinearGradient(gradient: Gradient(colors: [Color.black, Color.blue]), startPoint: .leading, endPoint: .trailing))
.cornerRadius(10)
.padding()
}
}
Group {
Text("HELIOSPHERICS").fontWeight(.bold).font(.subheadline)
.foregroundColor(Color(hue: 0.651, saturation: 1.0, brightness: 0.465))
.multilineTextAlignment(.center).padding(.vertical).frame(maxWidth: .infinity)
ForEach(0 ..< heliospherics.count, id: \.self) { i in
HStack {
Menu {
ForEach(0 ..< conditions.count) { j in
Button(conditions[j]) {
heliosphericsSeverity[i] = conditions[j]
}
}
} label: {
Text(heliospherics[i])
Image(systemName: "cloud.drizzle")
}.frame(maxWidth: .infinity)
Text("Current: " + heliosphericsSeverity[i]).frame(maxWidth: .infinity).font(.footnote).foregroundColor(.gray)
}.padding()
.foregroundColor(.white).background(LinearGradient(gradient: Gradient(colors: [Color.black, Color.blue]), startPoint: .leading, endPoint: .trailing))
.cornerRadius(10)
.padding()
}
}
HStack {
Button("Cancel") {
self.presentationMode.wrappedValue.dismiss()
}.frame(maxWidth: .infinity)
Button("Run"){
let jsonObj: Any = ["Threats": [], "launchPlatforms": availableLaunchPlatformSelections, "defensiveLayers": defensiveLayers.map({ ["layer": $0.name, "percentage": Int($0.percent) ] }), "sensorsAndSupports": sensorsAndSupports.map({ ["SensorSupport": $0.name, "percentage": Int($0.percent) ] }), "atmospherics:": atmosphericsSeverity.map({ ["weather": "", "intensity": $0 ] })]
print(convertJSON(array: jsonObj))
}.foregroundColor(.red).frame(maxWidth: .infinity)
}.frame(maxWidth: .infinity).padding(.all, 30)
}
}.onAppear() {
loadOpConditions(country: battery.replacingOccurrences(of: " ", with: ""), completionHandler: { (data: [Dictionary<String, Any>]) in
for row in data {
for _ in row["atmosperics"] as! [String]
{
atmosphericsSeverity.append("light")
}
for i in row["heliospherics"] as! [String]
{
heliosphericsSeverity.append("light")
}
heliospherics = row["heliospherics"] as! [String]
atmospherics = row["atmosperics"] as! [String]
for i in row["sensorsAndSupport"] as! [String]
{
sensorsAndSupports.append(Sliders(percent: 0, name: i))
}
for i in row["defensiveLayers"] as! [String]
{
defensiveLayers.append(Sliders(percent: 0, name: i ))
}
availableLaunchPlatforms = row["availableLaunchPlatforms"] as! [String]
}
})
}
}
func convertJSON(array: Any) -> String
{
do {
let jsonData = try JSONSerialization.data(withJSONObject: array, options: [])
if let jsonString = String(data: jsonData, encoding: String.Encoding.utf8) {
//print(jsonString)
return jsonString
}
else
{
return ""
}
} catch {
return "error"
}
}
func loadOpConditions(country: String, completionHandler: @escaping ([Dictionary<String, Any>]) -> Void) -> Void {
var request = URLRequest(url: URL(string: "https://salusdatalab.com/api/OperatingConditions/" + country)!,timeoutInterval: Double.infinity)
request.httpMethod = "GET"
// request.addValue("Bearer \(LoginViewController.myToken.bearerToken)", forHTTPHeaderField: "Authorization")
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data
else {
//p rint(String(describing: error))
return
}
//p rint(String(data: data, encoding: .utf8)!)
guard let json = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers)
else { return }
guard let rootArray = json as? Array<Dictionary<String,Any>>
else { return }
// The outer/root array seems useless from what you have shown in your JSON above, so this is to get to the array of dictionaries.
completionHandler(rootArray)
}
task.resume()
}
}
struct OperatingConditionsView_Previews: PreviewProvider {
static var previews: some View {
OperatingConditionsView()
}
}
struct weatherToggle:可识别{
设id=UUID()
变量值:Bool=false
}
结构滑块:可识别{
变量id:UUID
风险百分比:双
变量名称:String
初始化(百分比:双精度,名称:字符串){
self.id=UUID()
self.percent=百分比
self.name=名称
}
}
结构MyNodeView:视图{
@绑定var myNode:滑块
var body:一些观点{
HStack{
文本(\(字符串(格式:%.f',myNode.percent))%”。字体(.footnote)
滑块(值:$myNode.percent,单位:0…100)
}
}
}
结构操作条件视图:视图{
@状态变量选择:Int?=nil
让lightGray=颜色(色调:1.0,饱和度:0.0,亮度:0.392)
@环境(\.presentationMode)变量presentationMode:绑定
@国家私有var DefensiveElayers=[滑块]()
@状态变量sensorsAndSupports=[滑块]()
//@Binding public-var-threats:[任何]
@状态变量AvailableLanchPlatformSelections:[字符串]=[]
@状态变量项=[weatherToggle(),
weatherToggle(),
weatherToggle()]
@国家公共var电池=“韩国”
@状态变量atmosphericsSeverity=[String]()
@状态变量HelioSphereicsSeverity=[String]()
风险值条件=[“轻度”、“中度”、“重度”]
@状态变量HelioSphereics=[String]()
@状态变量atmospherics=[String]()
//@状态变量DefensiveElayers=[String]()
@状态变量AvailableLanchPlatform=[String]()
//@状态变量sensorsAndSupport=[String]()
var body:一些观点{
滚动视图{
VStack(对齐:。前导){
文本(“操作条件”).fontWeight(.bold)
.foregroundColor(颜色(色调:0.651,饱和度:1.0,亮度:0.465))
.multilineTextAlignment(.center).padding(.vertical).frame(最大宽度:。无穷大)
按钮(“加载存储的攻击参数集”){
}.padding(.leading,30)
文本(“资产准备就绪”).fontWeight(.bold).font(.subheadline)
.foregroundColor(颜色(色调:0.651,饱和度:1.0,亮度:0.465))
.multilineTextAlignment(.center).padding(.vertical).frame(最大宽度:。无穷大)
团体{
文本(“可用的启动平台”).fontWeight(.bold).foregroundColor(浅灰色).填充(.vertical).填充(.leading,30).字体(.system(大小:15))
VStack{
名单{
ForEach(AvailableLanchPlatform,id:\.self){launchPlatform in
MultipleSelectionRow(标题:launchPlatform,isSelected:self.availableLaunchPlatformSelections.contains(launchPlatform)){
如果self.availableLaunchPlatformSelections.contains(启动平台){
self.availableLaunchPlatformSelections.removeAll(其中:{$0==launchPlatform})
}
否则{
self.availableLaunchPlatformSelections.append(启动平台)
}
}.font(.custom(“Gill Sans”,大小:12)).foregroundColor(.gray)
}
}.frame(高度:250).font(.footnote)
}
}
团体{
文本(“其他防御层”).fontWeight(.bold).foregroundColor(浅灰色).填充(.vertical).填充(.leading,30).字体(.system(大小:15))
HStack{
VStack{
ForEach(defensiveelayers.index,id:\.self){i in
文本(DefensiveElayers[i].name).font(.custom(“Gill Sans”,大小:12)).padding(.training).foregroundColor(.gray).frame(最大高度:.infinity)
}
}
VStack{
ForEach(defensiveelayers.index,id:\.self){i in
MyNodeView(myNode:$DefensiveElayers[i])
}
}
}.padding(.卧式,30)
}
团体{
文本(“传感器和支持”).fontWeight(.bold).foregroundColor(浅灰色).填充(.vertical).填充(.leading,30).字体(.system(大小:15))
HStack{
VStack{
ForEach(sensorsAndSupports.index,id:\.self){i in
Text(sensorsAndSupports[i].name).font(.custom(“Gill Sans”,大小:12)).padding(.training).foregroundColor(.gray).frame(maxHeight:.infinity)
}
}
VStack{
ForEach(sensorsAndSupports.index,id:\.self){i in
MyNodeView(myNode:$sensorsAndSupports[i])
}
}
}.padding(.卧式,30)
}
团体{
文本(“大气”).fontWeight(.bold).font(.subheadline)
.foregroundColor(颜色(色调:0.651,饱和度:1.0,亮度:0.465))
.multilineTextAlignment(.center).padding(.vertical).frame(最大宽度:。无穷大)
ForEach(0..<大气c
struct OperatingConditionsView: View {
@State var selection: Int? = nil
let lightGray = Color(hue: 1.0, saturation: 0.0, brightness: 0.392)
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@State private var defensiveLayers = [Sliders]()
@State var sensorsAndSupports = [Sliders]()
// @Binding public var threats: [Any]
@State var availableLaunchPlatformSelections: [String] = []
@State var items = [weatherToggle(),
weatherToggle(),
weatherToggle()]
@State public var battery = "South Korea"
@State var atmosphericsSeverity = [String]()
@State var heliosphericsSeverity = [String]()
var conditions = ["light", "moderate", "severe"]
@State var heliospherics = [String]()
@State var atmospherics = [String]()
//@State var defensiveLayers = [String]()
@State var availableLaunchPlatforms = [String]()
//@State var sensorsAndSupport = [String]()
var topSection: some View {
Group {
Text("OPERATING CONDITIONS").fontWeight(.bold)
.foregroundColor(Color(hue: 0.651, saturation: 1.0, brightness: 0.465))
.multilineTextAlignment(.center).padding(.vertical).frame(maxWidth: .infinity)
Button("load stored attack parameter set"){
}.padding(.leading, 30)
Text("ASSET READINESS").fontWeight(.bold).font(.subheadline)
.foregroundColor(Color(hue: 0.651, saturation: 1.0, brightness: 0.465))
.multilineTextAlignment(.center).padding(.vertical).frame(maxWidth: .infinity)
}
}
var firstGroup : some View {
Group {
Text("Available launch platforms").fontWeight(.bold).foregroundColor(lightGray).padding(.vertical).padding(.leading, 30).font(.system(size: 15))
VStack {
List {
ForEach(availableLaunchPlatforms, id: \.self) { launchPlatform in
// MultipleSelectionRow(title: launchPlatform, isSelected: self.availableLaunchPlatformSelections.contains(launchPlatform)) {
// if self.availableLaunchPlatformSelections.contains(launchPlatform) {
// self.availableLaunchPlatformSelections.removeAll(where: { $0 == launchPlatform })
// }
// else {
// self.availableLaunchPlatformSelections.append(launchPlatform)
// }
// }.font(.custom("Gill Sans", size: 12)).foregroundColor(.gray)
}
}.frame(height: 250).font(.footnote)
}
}
}
//
var secondGroup : some View {
Group {
Text("Other defensive layers").fontWeight(.bold).foregroundColor(lightGray).padding(.vertical).padding(.leading, 30).font(.system(size: 15))
HStack {
VStack {
ForEach(defensiveLayers.indices, id: \.self) { i in
Text(defensiveLayers[i].name).font(.custom("Gill Sans", size: 12)).padding(.trailing).foregroundColor(.gray).frame(maxHeight: .infinity)
}
}
VStack {
ForEach(defensiveLayers.indices, id: \.self) { i in
MyNodeView(myNode: $defensiveLayers[i])
}
}
}.padding(.horizontal, 30)
}
}
//
var thirdGroup : some View {
Group {
Text("Sensors & Support").fontWeight(.bold).foregroundColor(lightGray).padding(.vertical).padding(.leading, 30).font(.system(size: 15))
HStack {
VStack {
ForEach(sensorsAndSupports.indices, id: \.self) { i in
Text(sensorsAndSupports[i].name).font(.custom("Gill Sans", size: 12)).padding(.trailing).foregroundColor(.gray).frame(maxHeight: .infinity)
}
}
VStack {
ForEach(sensorsAndSupports.indices, id: \.self) { i in
MyNodeView(myNode: $sensorsAndSupports[i])
}
}
}.padding(.horizontal, 30)
}
}
//
var fourthGroup : some View {
Group {
Text("ATMOSPHERICS").fontWeight(.bold).font(.subheadline)
.foregroundColor(Color(hue: 0.651, saturation: 1.0, brightness: 0.465))
.multilineTextAlignment(.center).padding(.vertical).frame(maxWidth: .infinity)
ForEach(0 ..< atmospherics.count, id: \.self) { (i:Int) in //<-- HERE
HStack {
Menu {
ForEach(0 ..< conditions.count) { (j:Int) in //<-- HERE
Button(conditions[j]) {
atmosphericsSeverity[i] = conditions[j]
}
}
} label: {
Text(atmospherics[i])
Image(systemName: "cloud.drizzle")
}
.frame(maxWidth: .infinity)
Text("Current: " + atmosphericsSeverity[i]).frame(maxWidth: .infinity).font(.footnote).foregroundColor(.gray)
}
.padding()
.foregroundColor(.white).background(LinearGradient(gradient: Gradient(colors: [Color.black, Color.blue]), startPoint: .leading, endPoint: .trailing))
.cornerRadius(10)
.padding()
}
}
}
//
var fifthGroup : some View {
Group {
Text("HELIOSPHERICS").fontWeight(.bold).font(.subheadline)
.foregroundColor(Color(hue: 0.651, saturation: 1.0, brightness: 0.465))
.multilineTextAlignment(.center).padding(.vertical).frame(maxWidth: .infinity)
ForEach(0 ..< heliospherics.count, id: \.self) { (i:Int) in //<-- HERE
HStack {
Menu {
ForEach(0 ..< conditions.count) { (j:Int) in //<-- HERE
Button(conditions[j]) {
heliosphericsSeverity[i] = conditions[j]
}
}
} label: {
Text(heliospherics[i])
Image(systemName: "cloud.drizzle")
}.frame(maxWidth: .infinity)
Text("Current: " + heliosphericsSeverity[i]).frame(maxWidth: .infinity).font(.footnote).foregroundColor(.gray)
}.padding()
.foregroundColor(.white).background(LinearGradient(gradient: Gradient(colors: [Color.black, Color.blue]), startPoint: .leading, endPoint: .trailing))
.cornerRadius(10)
.padding()
}
}
}
var lastButtons : some View {
HStack {
Button("Cancel") {
self.presentationMode.wrappedValue.dismiss()
}.frame(maxWidth: .infinity)
Button("Run"){
let jsonObj: Any = ["Threats": [], "launchPlatforms": availableLaunchPlatformSelections, "defensiveLayers": defensiveLayers.map({ ["layer": $0.name, "percentage": Int($0.percent) ] }), "sensorsAndSupports": sensorsAndSupports.map({ ["SensorSupport": $0.name, "percentage": Int($0.percent) ] }), "atmospherics:": atmosphericsSeverity.map({ ["weather": "", "intensity": $0 ] })]
print(convertJSON(array: jsonObj))
}.foregroundColor(.red).frame(maxWidth: .infinity)
}.frame(maxWidth: .infinity).padding(.all, 30)
}
var body: some View {
ScrollView {
VStack(alignment: .leading) {
topSection
firstGroup
secondGroup
thirdGroup
fourthGroup
fifthGroup
lastButtons
}
}.onAppear() {
onAppearFunc()
}
}
func onAppearFunc() {
loadOpConditions(country: battery.replacingOccurrences(of: " ", with: ""), completionHandler: { (data: [Dictionary<String, Any>]) in
for row in data {
for _ in row["atmosperics"] as! [String]
{
atmosphericsSeverity.append("light")
}
for i in row["heliospherics"] as! [String]
{
heliosphericsSeverity.append("light")
}
heliospherics = row["heliospherics"] as! [String]
atmospherics = row["atmosperics"] as! [String]
for i in row["sensorsAndSupport"] as! [String]
{
sensorsAndSupports.append(Sliders(percent: 0, name: i))
}
for i in row["defensiveLayers"] as! [String]
{
defensiveLayers.append(Sliders(percent: 0, name: i ))
}
availableLaunchPlatforms = row["availableLaunchPlatforms"] as! [String]
}
})
}
func convertJSON(array: Any) -> String
{
do {
let jsonData = try JSONSerialization.data(withJSONObject: array, options: [])
if let jsonString = String(data: jsonData, encoding: String.Encoding.utf8) {
//print(jsonString)
return jsonString
}
else
{
return ""
}
} catch {
return "error"
}
}
func loadOpConditions(country: String, completionHandler: @escaping ([Dictionary<String, Any>]) -> Void) -> Void {
var request = URLRequest(url: URL(string: "https://salusdatalab.com/api/OperatingConditions/" + country)!,timeoutInterval: Double.infinity)
request.httpMethod = "GET"
// request.addValue("Bearer \(LoginViewController.myToken.bearerToken)", forHTTPHeaderField: "Authorization")
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data
else {
//p rint(String(describing: error))
return
}
//p rint(String(data: data, encoding: .utf8)!)
guard let json = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers)
else { return }
guard let rootArray = json as? Array<Dictionary<String,Any>>
else { return }
// The outer/root array seems useless from what you have shown in your JSON above, so this is to get to the array of dictionaries.
completionHandler(rootArray)
}
task.resume()
}
}