Swift: EXC_BREAKPOINT при попытке проверить, равна ли переменная ObservedObject нулю

Мне нравится проверять, равна ли переменная нулю, потому что она устанавливается при установке соединения с сервером. Но когда я это делаю, я получаю код EXC_BREAKPOINT = 1. Я не могу понять, почему. Вот код:

struct CategoryView: View {
@ObservedObject var viewRouter: ViewRouter
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

var body: some View {
    NavigationView {
        if (viewRouter.menuStructure != nil) {
            CategoryPage(viewRouter: viewRouter, settingsShown: true, pageTitle: "Räume", items: viewRouter.menuStructure?.items ?? [])
        }
    }
    .edgesIgnoringSafeArea(.top)
}

bt в отладчике показывает следующее:

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=1, subcode=0x1a1d79bd4)
  * frame #0: 0x00000001a1d79bd4 SwiftUI`SwiftUI.ColumnNavigationView.BodyContent.body.getter : some + 944
    frame #1: 0x00000001a1ba22f4 SwiftUI`generic specialization  of SwiftUI.ViewBodyAccessor.updateBody(of: A, changed: Swift.Bool) -> () + 1276
    frame #2: 0x00000001a1cac218 SwiftUI`generic specialization >.0, SwiftUI.StaticBody>> of implicit closure #2 (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in implicit closure #1 (A1.Type) -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 () -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 (Swift.UnsafePointer) -> AttributeGraph.Attribute in AttributeGraph.Attribute.init(A1) -> AttributeGraph.Attribute + 40
    frame #3: 0x00000001c39aabc0 AttributeGraph`AG::Graph::UpdateStack::update() + 492
    frame #4: 0x00000001c39aaff4 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr, bool) + 332
    frame #5: 0x00000001c39b06f8 AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr, AG::AttributeID, unsigned int, AGSwiftMetadata const*, bool*, long) + 384
    frame #6: 0x00000001c39c272c AttributeGraph`AGGraphGetValue + 232
    frame #7: 0x00000001a1a5923c SwiftUI`generic specialization >, SwiftUI.MulticolumnSplitView>, SwiftUI.MulticolumnSplitView, Swift.AnyHashable, SwiftUI._VariadicView_Children.Element>>>> of (extension in SwiftUI):SwiftUI._ConditionalContent.(ChildView in _1A625ACC143FD8524C590782FD8F4F8C).content.getter : SwiftUI._ConditionalContent + 48
    frame #8: 0x00000001a1a59d78 SwiftUI`generic specialization >, SwiftUI.MulticolumnSplitView>, SwiftUI.MulticolumnSplitView, Swift.AnyHashable, SwiftUI._VariadicView_Children.Element>>>> of (extension in SwiftUI):SwiftUI._ConditionalContent.(ChildView in _1A625ACC143FD8524C590782FD8F4F8C).value.getter : SwiftUI.AnyView + 40
    frame #9: 0x00000001a1a7c230 SwiftUI`merged generic specialization , SwiftUI._EnvironmentKeyWritingModifier>>, SwiftUI._EnvironmentKeyWritingModifier>>, SwiftUI._EnvironmentKeyWritingModifier>, SwiftUI._AlignmentLayout>, SwiftUI._PaddingLayout>, SwiftUI._PaddingLayout>, SwiftUI.SizeLimitLayout>, SwiftUI._BackgroundModifier, SwiftUI.ModifiedContent, SwiftUI._FrameLayout>, SwiftUI._PushPopTransactionModifier>, SwiftUI._OffsetEffect>)>>>>, SwiftUI._BackgroundModifier, SwiftUI.ModifiedContent, SwiftUI._FrameLayout>, SwiftUI._PushPopTransactionModifier>, SwiftUI._OffsetEffect>)>>>>, SwiftUI._EnvironmentKeyWritingModifier>>, SwiftUI.ModifiedContent, SwiftUI._EnvironmentKeyWritingModifier>>, SwiftUI._EnvironmentKeyWritingModifier>>, SwiftUI._EnvironmentKeyWritingModifier>, SwiftUI._AlignmentLayout>, SwiftUI._PaddingLayout>, SwiftUI._PaddingLayout>, SwiftUI.SizeLimitLayout>, SwiftUI._BackgroundModifier, SwiftUI.ModifiedContent, SwiftUI._FrameLayout>, SwiftUI._PushPopTransactionModifier>, SwiftUI._OffsetEffect>)>>>>, SwiftUI._BackgroundModifier, SwiftUI.ModifiedContent, SwiftUI._FrameLayout>, SwiftUI._PushPopTransactionModifier>, SwiftUI._OffsetEffect>)>>>>, SwiftUI._EnvironmentKeyWritingModifier>>, SwiftUI._EnvironmentKeyWritingModifier>>, SwiftUI._EnvironmentKeyWritingModifier>>>.(ChildView in _1A625ACC143FD8524C590782FD8F4F8C)> of implicit closure #2 (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in implicit closure #1 (A1.Type) -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 () -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 (Swift.UnsafePointer) -> AttributeGraph.Attribute in AttributeGraph.Attribute.init(A1) -> AttributeGraph.Attribute + 32
    frame #10: 0x00000001a1a9fcd8 SwiftUI`partial apply forwarder for generic specialization >, SwiftUI.MulticolumnSplitView>, SwiftUI.MulticolumnSplitView, Swift.AnyHashable, SwiftUI._VariadicView_Children.Element>>>>.(ChildView in _1A625ACC143FD8524C590782FD8F4F8C)> of implicit closure #2 (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in implicit closure #1 (A1.Type) -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 () -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 (Swift.UnsafePointer) -> AttributeGraph.Attribute in AttributeGraph.Attribute.init(A1) -> AttributeGraph.Attribute + 28
    frame #11: 0x00000001c39aabc0 AttributeGraph`AG::Graph::UpdateStack::update() + 492
    frame #12: 0x00000001c39aaff4 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr, bool) + 332
    frame #13: 0x00000001c39b06f8 AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr, AG::AttributeID, unsigned int, AGSwiftMetadata const*, bool*, long) + 384
    frame #14: 0x00000001c39c272c AttributeGraph`AGGraphGetValue + 232
    frame #15: 0x00000001a2069728 SwiftUI`SwiftUI.(AnyViewList in _A96961F3546506F21D8995C6092F15B5).updateValue() -> () + 60
    frame #16: 0x00000001a1cd0434 SwiftUI`partial apply forwarder for generic specialization  of implicit closure #2 (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in implicit closure #1 (A1.Type) -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 () -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 (Swift.UnsafePointer) -> AttributeGraph.Attribute in AttributeGraph.Attribute.init(A1) -> AttributeGraph.Attribute + 24
    frame #17: 0x00000001c39aabc0 AttributeGraph`AG::Graph::UpdateStack::update() + 492
    frame #18: 0x00000001c39aaff4 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr, bool) + 332
    frame #19: 0x00000001c39b06f8 AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr, AG::AttributeID, unsigned int, AGSwiftMetadata const*, bool*, long) + 384
    frame #20: 0x00000001c39c272c AttributeGraph`AGGraphGetValue + 232
    frame #21: 0x00000001a1e85f74 SwiftUI`SwiftUI.(DynamicLayoutViewAdaptor in _8B9C7F39264416187A895085215951BC).updatedItems() -> Swift.Optional + 64
    frame #22: 0x00000001a1bc1fe0 SwiftUI`generic specialization  of SwiftUI.DynamicContainerInfo.(updateItems in _023AA827B8A8D39774F7A0C281455FEE)(disableTransitions: Swift.Bool) -> (changed: Swift.Bool, hasDepth: Swift.Bool) + 68
    frame #23: 0x00000001a1bc106c SwiftUI`generic specialization  of SwiftUI.DynamicContainerInfo.updateValue() -> () + 340
    frame #24: 0x00000001a1cb1514 SwiftUI`partial apply forwarder for generic specialization > of implicit closure #2 (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in implicit closure #1 (A1.Type) -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 () -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 (Swift.UnsafePointer) -> AttributeGraph.Attribute in AttributeGraph.Attribute.init(A1) -> AttributeGraph.Attribute + 24
    frame #25: 0x00000001c39aabc0 AttributeGraph`AG::Graph::UpdateStack::update() + 492
    frame #26: 0x00000001c39aaff4 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr, bool) + 332
    frame #27: 0x00000001c39b06f8 AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr, AG::AttributeID, unsigned int, AGSwiftMetadata const*, bool*, long) + 384
    frame #28: 0x00000001c39c272c AttributeGraph`AGGraphGetValue + 232
    frame #29: 0x00000001a1d37768 SwiftUI`SwiftUI.(DynamicPreferenceCombiner in _023AA827B8A8D39774F7A0C281455FEE).info.getter : Swift.Optional + 96
    frame #30: 0x00000001a1d37960 SwiftUI`SwiftUI.(DynamicPreferenceCombiner in _023AA827B8A8D39774F7A0C281455FEE).value.getter : A.Value + 204
    frame #31: 0x00000001a1ae2f9c SwiftUI`implicit closure #2 (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in implicit closure #1 (A1.Type) -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 () -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 (Swift.UnsafePointer) -> AttributeGraph.Attribute in AttributeGraph.Attribute.init(A1) -> AttributeGraph.Attribute + 124
    frame #32: 0x00000001c39aabc0 AttributeGraph`AG::Graph::UpdateStack::update() + 492
    frame #33: 0x00000001c39aaff4 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr, bool) + 332
    frame #34: 0x00000001c39b06f8 AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr, AG::AttributeID, unsigned int, AGSwiftMetadata const*, bool*, long) + 384
    frame #35: 0x00000001c39c272c AttributeGraph`AGGraphGetValue + 232
    frame #36: 0x00000001a1d37c14 SwiftUI`SwiftUI.(DynamicPreferenceCombiner in _023AA827B8A8D39774F7A0C281455FEE).value.getter : A.Value + 896
    frame #37: 0x00000001a1ae2f9c SwiftUI`implicit closure #2 (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in implicit closure #1 (A1.Type) -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 () -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 (Swift.UnsafePointer) -> AttributeGraph.Attribute in AttributeGraph.Attribute.init(A1) -> AttributeGraph.Attribute + 124
    frame #38: 0x00000001c39aabc0 AttributeGraph`AG::Graph::UpdateStack::update() + 492
    frame #39: 0x00000001c39aaff4 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr, bool) + 332
    frame #40: 0x00000001c39b06f8 AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr, AG::AttributeID, unsigned int, AGSwiftMetadata const*, bool*, long) + 384
    frame #41: 0x00000001c39c272c AttributeGraph`AGGraphGetValue + 232
    frame #42: 0x00000001a2009d90 SwiftUI`SwiftUI.(HostPreferencesTransform in _5EC2B8E51282B711F818D51701767C64).updateValue() -> () + 88
    frame #43: 0x00000001a1d3ec10 SwiftUI`partial apply forwarder for implicit closure #2 (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in implicit closure #1 (A1.Type) -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 () -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 (Swift.UnsafePointer) -> AttributeGraph.Attribute in AttributeGraph.Attribute.init(A1) -> AttributeGraph.Attribute + 32
    frame #44: 0x00000001c39aabc0 AttributeGraph`AG::Graph::UpdateStack::update() + 492
    frame #45: 0x00000001c39aaff4 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr, bool) + 332
    frame #46: 0x00000001c39b0154 AttributeGraph`AG::Graph::value_ref(AG::AttributeID, AGSwiftMetadata const*, bool*) + 156
    frame #47: 0x00000001c39c2774 AttributeGraph`AGGraphGetValue + 304
    frame #48: 0x00000001a236d5b8 SwiftUI`SwiftUI.GraphHost.updatePreferences() -> Swift.Bool + 56
    frame #49: 0x00000001a1e5b9d4 SwiftUI`SwiftUI.ViewGraph.updateOutputs(at: SwiftUI.Time) -> () + 112
    frame #50: 0x00000001a22c2eac SwiftUI`closure #1 () -> () in (extension in SwiftUI):SwiftUI.ViewRendererHost.render(interval: Swift.Double, updateDisplayList: Swift.Bool) -> () + 1444
    frame #51: 0x00000001a22ba090 SwiftUI`(extension in SwiftUI):SwiftUI.ViewRendererHost.render(interval: Swift.Double, updateDisplayList: Swift.Bool) -> () + 340
    frame #52: 0x00000001a243ee00 SwiftUI`SwiftUI._UIHostingView.layoutSubviews() -> () + 176
    frame #53: 0x00000001a243ee34 SwiftUI`@objc SwiftUI._UIHostingView.layoutSubviews() -> () + 28
    frame #54: 0x000000019e383d90 UIKitCore`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2504
    frame #55: 0x000000019e899384 QuartzCore`-[CALayer layoutSublayers] + 308
    frame #56: 0x000000019e899858 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 524
    frame #57: 0x000000019e8adff8 QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 144
    frame #58: 0x000000019e7f3ee0 QuartzCore`CA::Context::commit_transaction(CA::Transaction*, double, double*) + 416
    frame #59: 0x000000019e81f36c QuartzCore`CA::Transaction::commit() + 732
    frame #60: 0x000000019de55240 UIKitCore`__34-[UIApplication _firstCommitBlock]_block_invoke_2 + 84
    frame #61: 0x000000019b40449c CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 28
    frame #62: 0x000000019b4036e4 CoreFoundation`__CFRunLoopDoBlocks + 408
    frame #63: 0x000000019b3fdaa0 CoreFoundation`__CFRunLoopRun + 844
    frame #64: 0x000000019b3fd21c CoreFoundation`CFRunLoopRunSpecific + 600
    frame #65: 0x00000001b247c784 GraphicsServices`GSEventRunModal + 164
    frame #66: 0x000000019de36200 UIKitCore`-[UIApplication _run] + 1072
    frame #67: 0x000000019de3ba74 UIKitCore`UIApplicationMain + 168
    frame #68: 0x00000001a22fcb20 SwiftUI`closure #1 (Swift.UnsafeMutablePointer>>) -> Swift.Never in SwiftUI.(KitRendererCommon in _ACC2C5639A7D76F611E170E831FCA491)(Swift.AnyObject.Type) -> Swift.Never + 112
    frame #69: 0x00000001a22fcaac SwiftUI`SwiftUI.runApp(A) -> Swift.Never + 220
    frame #70: 0x00000001a1e54e5c SwiftUI`static (extension in SwiftUI):SwiftUI.App.main() -> () + 140
    frame #71: 0x0000000102377478 JarvisHome`static JarvisHomeApp.$main(self=JarvisHome.JarvisHomeApp) at :0
    frame #72: 0x0000000102379cf8 JarvisHome`main at JarvisHomeApp.swift:0
    frame #73: 0x000000019b0bd6c0 libdyld.dylib`start + 4

Любые предложения, почему? Если я закомментирую код строки if, это не приведет к сбою.

Обновлено: ViewRouter.swift

import Foundation
import Combine
import SwiftUI

class ViewRouter: ObservableObject {
    let objectWillChange = PassthroughSubject<ViewRouter, Never>()
    
    var currentPage: String = "myhome" {
        didSet {
            objectWillChange.send(self)
        }
    }
    
    var symcSocketStatus: String = "connecting" {
        didSet {
            objectWillChange.send(self)
        }
    }
    
    var syncSocketStatusShown: Bool = true {
        didSet {
            objectWillChange.send(self)
        }
    }
    
    var settingsShown: Bool = false {
        didSet {
            objectWillChange.send(self)
        }
    }
    
    var menuStructure: MenuItem? = nil {
        didSet {
            objectWillChange.send(self)
        }
    }
}

Обновлено: MenuItem.swift

import Foundation

struct MenuItem: Codable {
    //var data: [String: Any]
    var disabled: Bool
    var hidden: Bool
    var icon: String?
    var id: Int
    var ident: String
    var info: String
    var items: [MenuItem]?
    var name: String
    var parentId: Int?
    var position: Int
    var readOnly: Bool
    var summary: String
    var type: Int
    
    init() {
//        self.data = ["": ""]
        self.disabled =  true
        self.hidden = false
        self.icon = ""
        self.id = -1
        self.ident = ""
        self.info = ""
        self.items = []
        self.name = "Unknown"
        self.parentId = 0
        self.position = 0
        self.readOnly = true
        self.summary = ""
        self.type = -1
    }
}

Поделитесь, пожалуйста, ViewRouter

davidev 15.12.2020 00:59

ViewRouter выдает кучу ошибок при попытке компиляции.

davidev 15.12.2020 10:11

Мой нормально компилируется. Я думаю, что в вашем проекте отсутствует структура «MenuItem». Я добавлю это к моему вопросу.

Alexander Hill 15.12.2020 10:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
517
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наконец-то можно воссоздать эту проблему. Похоже, проблема в том, что у вас нет представления внутри NavigationView на случай, если ваш if вернет false. Просто добавьте случай else с любым представлением, чтобы решить эту проблему.

struct ContentView: View {
    @ObservedObject var viewRouter: ViewRouter
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

    var body: some View {
        NavigationView {
            if (viewRouter.menuStructure != nil) {
                CategoryPage(viewRouter: viewRouter, settingsShown: true, pageTitle: "Räume", items: viewRouter.menuStructure?.items ?? [])
            }
            else {
                Text("Menu Structure not loaded") //<< Some View where
            }
        }
        .edgesIgnoringSafeArea(.top)
    }
}

Большое спасибо! Я только что столкнулся с аналогичной проблемой, когда у меня было неисчерпывающее предложение if-else внутри моего NavigationView, и каждый раз, когда выражение не совпадало, я получал ошибку EXC_BREAKPOINT от lldb. Я надеюсь, что этот пост спасет массу жизней в будущем!

Nikandr Marhal 09.02.2021 10:01

Другие вопросы по теме