下面的文件每次都失败,它甚至不让我看到视图的预览。我知道是怎么回事了。我已经退出了Xcode,我已经清理了build文件夹。我所能想到的一切,我都做过了。我正在开发Xcode版本12.2。有谁有什么想法吗?
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()
}
}我把它放在这里是因为它说你的帖子主要是代码。提前感谢您的帮助。
发布于 2021-05-18 00:06:53
要调试这种类型的情况,您通常会希望将视图/正文部分拆分为多个块,以便注释掉/修改。
通过这样做,我将范围缩小到了你们的第四组和第五组。先编码后解释:
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()
}
}我注意到,如果第四组和第五组被注释掉,编译时间就会显著改善。所以,我开始深入研究它们。
通常,尝试进行类型推断会对Swift编译时间产生不利影响。在这种情况下,指定ForEach闭包参数的类型(请参阅我的//<-- HERE行)似乎已经固定了编译时间。
当然,这种精确的修复不会每次都有效,但我希望我已经概述了如何调试它的策略。
注意:我在使用MultipleSelectionRow的地方留下了一些注释--请确保,如果您在本文中包含代码,请包含所有相关信息,以便其他人编译它
https://stackoverflow.com/questions/67572760
复制相似问题