[*] iPhone 16 Simulator mit iOS 18.5 (Ursache Absturz) < /li>
iPhone 15 Simulator mit iOS 17.5 (Ursache Warnungen) < /li>
< /ul>
Die folgende Code kann das Problem mit der folgenden Textgröße reproduzieren. src = "https://i.static.net/azvji28jm.png"/>
Code: Select all
struct ContentView: View {
let item1 = "The quick brown fox jumps over the lazy dog."
let item2 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
@State private var isExpanded = false
enum LayoutHint {
case normal
case spaceIsTight
case scrolling
}
private func itemList(items: [String], hint: LayoutHint) -> some View {
VStack(alignment: .leading, spacing: 9) {
ForEach(Array(items.enumerated()), id: \.offset) { _, text in
Text(text)
.font(.footnote)
}
}
.frame(maxWidth: .infinity, alignment: .leading)
.fixedSize(horizontal: false, vertical: true)
}
private func expandedExplanation(items: [String]) -> some View {
ViewThatFits(in: .vertical) {
// If any of these 3 views are commented out, it works
itemList(items: items, hint: .normal)
itemList(items: items, hint: .spaceIsTight)
ScrollView {
itemList(items: items, hint: .scrolling)
}
}
}
private var chevronUp: some View {
Image(systemName: "chevron.compact.up")
.imageScale(.medium)
.font(.title)
.fontWeight(.semibold)
.foregroundStyle(.gray)
// If vertical padding is added, it works
// .padding(.vertical, 10)
.frame(maxWidth: .infinity)
}
private var expandedContent: some View {
VStack(alignment: .leading, spacing: 20) {
expandedExplanation(items: [item1, item2])
// If chevronUp is commented out, it works
chevronUp
}
.padding()
}
private var collapsedContent: some View {
Text("Show expanded")
.foregroundStyle(Color(.link))
.padding()
.frame(maxWidth: .infinity)
}
var body: some View {
ZStack(alignment: .top) {
if isExpanded {
expandedContent
} else {
collapsedContent
}
}
.clipped()
.contentShape(.rect)
.background {
UnevenRoundedRectangle(
topLeadingRadius: 0,
bottomLeadingRadius: 20,
bottomTrailingRadius: 20,
topTrailingRadius: 0
)
.fill(Color(.systemGray6))
.ignoresSafeArea(edges: .top)
}
.onTapGesture {
withAnimation(.easeInOut(duration: 0.25)) {
isExpanded.toggle()
}
}
.frame(maxHeight: .infinity, alignment: .top)
}
}

The crash that happens when running on the iPhone 16 simulator with iOS 18.5 is as follows:
#0 0x0000000102506e28 in _dispatch_assert_queue_fail ()
#1 0x000000010253c388 in dispatch_assert_queue$V2.cold.1 ()
#2 0x0000000102506db0 in dispatch_assert_queue ()
#3 0x0000000249df246c in swift_task_isCurrentExecutorWithFlagsImpl ()
#4 0x0000000102e80504 in closure #1 in closure #1 in ContentView.itemList(items:hint:) ()
#5 0x0000000102e807d4 in thunk for @escaping @callee_guaranteed (@unowned Int, @guaranteed String) -> (@owned Text) ()
#6 0x00000001d4c8cd24 in closure #1 () -> τ_0_2 in SwiftUI.ForEachState.item(at: τ_0_0.Index, offset: Swift.Int) -> SwiftUI.ForEachState.Item ()
#7 0x00000001d4c94dac in partial apply forwarder for closure #1 () -> τ_0_2 in SwiftUI.ForEachState.item(at: τ_0_0.Index, offset: Swift.Int) -> SwiftUI.ForEachState.Item ()
#8 0x00000001d4a7004c in closure #1 (Swift.UnsafeMutablePointer>) throws -> τ_0_0 in SwiftUI._withObservation(do: () throws -> τ_0_0) throws -> (value: τ_0_0, accessList: Swift.Optional) ()
#9 0x00000001d473a6d8 in partial apply forwarder for closure #1 (Swift.UnsafeMutablePointer>) throws -> τ_0_0 in SwiftUI._withObservation(do: () throws -> τ_0_0) throws -> (value: τ_0_0, accessList: Swift.Optional) ()
#10 0x00000001d48c9288 in withUnsafePointer ()
#11 0x00000001d4c8c160 in item ()
#12 0x00000001d4c8e24c in forEachItem ()
#13 0x00000001d4c94b38 in function signature specialization of SwiftUI.ForEachList.applyNodes(from: inout Swift.Int, style: SwiftUI._ViewList_IteratorStyle, list: Swift.Optional>, transform: inout SwiftUI._ViewList_SublistTransform, to: (inout Swift.Int, SwiftUI._ViewList_IteratorStyle, SwiftUI._ViewList_Node, inout SwiftUI._ViewList_SublistTransform) -> Swift.Bool) -> Swift.Bool ()
#14 0x00000001d4c92ec8 in protocol witness for SwiftUI.ViewList.applyNodes(from: inout Swift.Int, style: SwiftUI._ViewList_IteratorStyle, list: Swift.Optional>, transform: inout SwiftUI._ViewList_SublistTransform, to: (inout Swift.Int, SwiftUI._ViewList_IteratorStyle, SwiftUI._ViewList_Node, inout SwiftUI._ViewList_SublistTransform) -> Swift.Bool) -> Swift.Bool in conformance SwiftUI.ForEachList : SwiftUI.ViewList in SwiftUI ()
#15 0x00000001d49a8374 in applySublists ()
#16 0x00000001d49a501c in applySublists ()
#17 0x00000001d460d09c in generic specialization of SwiftUI.DynamicContainerInfo.updateItems(disableTransitions: Swift.Bool) -> (changed: Swift.Bool, hasDepth: Swift.Bool) ()
#18 0x00000001d460c258 in generic specialization of SwiftUI.DynamicContainerInfo.updateValue() -> () ()
#19 0x00000001d462b764 in generic specialization > of implicit closure #1 (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 () -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 (Swift.UnsafePointer) -> AttributeGraph.Attribute in AttributeGraph.Attribute.init(τ_1_0) -> AttributeGraph.Attribute ()
#20 0x00000001c00ca438 in AG::Graph::UpdateStack::update ()
#21 0x00000001c00cac04 in AG::Graph::update_attribute ()
#22 0x00000001c00d24dc in AG::Graph::input_value_ref_slow ()
#23 0x00000001c00e8054 in AGGraphGetValue ()
#24 0x00000001d496010c in SwiftUI.DynamicLayoutComputer.containerInfo.getter : Swift.Optional ()
#25 0x00000001d4960248 in updateValue ()
#26 0x00000001d4947d58 in partial apply forwarder for implicit closure #1 (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 () -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 (Swift.UnsafePointer) -> AttributeGraph.Attribute in AttributeGraph.Attribute.init(τ_1_0) -> AttributeGraph.Attribute ()
#27 0x00000001c00ca438 in AG::Graph::UpdateStack::update ()
#28 0x00000001c00cac04 in AG::Graph::update_attribute ()
#29 0x00000001c00d22f0 in AG::Graph::input_value_ref_slow ()
#30 0x00000001c00e7e14 in AGGraphGetInputValue ()
#31 0x00000001d47d1904 in size ()
#32 0x00000001d4aab49c in sizeThatFits ()
#33 0x00000001d4aabe74 in protocol witness for SwiftUI.UnaryLayout.sizeThatFits(in: SwiftUI._ProposedSize, context: SwiftUI.SizeAndSpacingContext, child: SwiftUI.LayoutProxy) -> __C.CGSize in conformance SwiftUI._FlexFrameLayout : SwiftUI.UnaryLayout in SwiftUI ()
#34 0x00000001d4934fcc in merged SwiftUI.UnaryLayoutEngine.sizeThatFits(SwiftUI._ProposedSize) -> __C.CGSize ()
#35 0x00000001d4934cf4 in protocol witness for SwiftUI.LayoutEngine.sizeThatFits(SwiftUI._ProposedSize) -> __C.CGSize in conformance SwiftUI.UnaryLayoutEngine : SwiftUI.LayoutEngine in SwiftUI ()
#36 0x00000001d4b700ac in sizeThatFits ()
#37 0x00000001d47d1970 in size ()
#38 0x00000001d4664b3c in protocol witness for SwiftUI.UnaryLayout.sizeThatFits(in: SwiftUI._ProposedSize, context: SwiftUI.SizeAndSpacingContext, child: SwiftUI.LayoutProxy) -> __C.CGSize in conformance SwiftUI._FixedSizeLayout : SwiftUI.UnaryLayout in SwiftUI ()
#39 0x00000001d4934fcc in merged SwiftUI.UnaryLayoutEngine.sizeThatFits(SwiftUI._ProposedSize) -> __C.CGSize ()
#40 0x00000001d4934cf4 in protocol witness for SwiftUI.LayoutEngine.sizeThatFits(SwiftUI._ProposedSize) -> __C.CGSize in conformance SwiftUI.UnaryLayoutEngine : SwiftUI.LayoutEngine in SwiftUI ()
#41 0x00000001d4b700ac in sizeThatFits ()
#42 0x00000001d4b6ee60 in sizeThatFits ()
#43 0x00000001d3b4e35c in closure #1 (SwiftUI._ViewOutputs, Swift.Bool) -> Swift.Bool in closure #1 () -> () in SwiftUI.SizeFittingLayoutComputer.Engine.explicitAlignment(_: SwiftUI.AlignmentKey, at: SwiftUI.ViewSize) -> Swift.Optional ()
#44 0x00000001d3b4cfec in closure #1 (SwiftUI._ViewList_Sublist) -> Swift.Bool in SwiftUI.SizeFittingState.applyChildren(selectLast: Swift.Bool, to: (SwiftUI._ViewOutputs, Swift.Bool) -> Swift.Bool) -> () ()
#45 0x00000001d49a7640 in applySublists ()
#46 0x00000001d49b09e8 in merged partial apply forwarder for closure #1 (inout Swift.Int, SwiftUI._ViewList_IteratorStyle, SwiftUI._ViewList_Node, inout SwiftUI._ViewList_SublistTransform) -> Swift.Bool in SwiftUI._ViewList_Node.applySublists(from: inout Swift.Int, style: SwiftUI._ViewList_IteratorStyle, transform: inout SwiftUI._ViewList_SublistTransform, to: (SwiftUI._ViewList_Sublist) -> Swift.Bool) -> Swift.Bool ()
#47 0x00000001d49abddc in applyNodes ()
#48 0x00000001d49a8374 in applySublists ()
#49 0x00000001d49a501c in applySublists ()
#50 0x00000001d3b4c190 in applyChildren ()
#51 0x00000001d3b4e144 in closure #1 () -> () in SwiftUI.SizeFittingLayoutComputer.Engine.explicitAlignment(_: SwiftUI.AlignmentKey, at: SwiftUI.ViewSize) -> Swift.Optional ()
#52 0x00000001c00cafb0 in AG::Graph::with_update ()
#53 0x00000001d3b4e524 in protocol witness for SwiftUI.LayoutEngine.explicitAlignment(_: SwiftUI.AlignmentKey, at: SwiftUI.ViewSize) -> Swift.Optional in conformance SwiftUI.SizeFittingLayoutComputer.Engine : SwiftUI.LayoutEngine in SwiftUI ()
#54 0x00000001d4b70194 in explicitAlignment ()
#55 0x00000001d4c16cfc in function signature specialization Swift.Optional in SwiftUI.StackLayout.(UnmanagedImplementation in _00690F480F8D293143B214DBE6D72CD0).placeChildren(in: SwiftUI.ProposedViewSize) -> (), Argument Types : [Swift.Optional]> of SwiftUI.StackLayout.UnmanagedImplementation.sizeChildrenGenerallyWithConcreteMajorProposal(in: SwiftUI.ProposedViewSize, minorProposalForChild: (SwiftUI.StackLayout.Child) -> Swift.Optional) -> () ()
#56 0x00000001d4c1779c in function signature specialization Swift.Optional in SwiftUI.StackLayout.(UnmanagedImplementation in _00690F480F8D293143B214DBE6D72CD0).placeChildren(in: SwiftUI.ProposedViewSize) -> (), Argument Types : [Swift.Optional]> of SwiftUI.StackLayout.UnmanagedImplementation.placeChildren1(in: SwiftUI.ProposedViewSize, minorProposalForChild: (SwiftUI.StackLayout.Child) -> Swift.Optional) -> () ()
#57 0x00000001d4c15fb4 in placeChildren ()
#58 0x00000001d4c15c84 in explicitAlignment ()
#59 0x00000001d4c14664 in explicitAlignment ()
#60 0x00000001d47a46a8 in merged protocol witness for SwiftUI.Layout.explicitAlignment(of: SwiftUI.HorizontalAlignment, in: __C.CGRect, proposal: SwiftUI.ProposedViewSize, subviews: SwiftUI.LayoutSubviews, cache: inout τ_0_0.Cache) -> Swift.Optional in conformance SwiftUI._VStackLayout : SwiftUI.Layout in SwiftUI ()
#61 0x00000001d496875c in closure #1 (Swift.UnsafeMutablePointer) -> Swift.Optional in closure #1 (Swift.UnsafeMutablePointer>) -> Swift.Optional in SwiftUI.ViewLayoutEngine.explicitAlignment(_: SwiftUI.AlignmentKey, at: SwiftUI.ViewSize) -> Swift.Optional ()
#62 0x00000001d49684c4 in closure #1 (Swift.UnsafeMutablePointer>) -> Swift.Optional in SwiftUI.ViewLayoutEngine.explicitAlignment(_: SwiftUI.AlignmentKey, at: SwiftUI.ViewSize) -> Swift.Optional ()
#63 0x00000001d496ab24 in partial apply forwarder for closure #1 (Swift.UnsafeMutablePointer>) -> Swift.Optional in SwiftUI.ViewLayoutEngine.explicitAlignment(_: SwiftUI.AlignmentKey, at: SwiftUI.ViewSize) -> Swift.Optional ()
#64 0x00000001d48c9288 in withUnsafePointer ()
#65 0x00000001d496837c in explicitAlignment ()
#66 0x00000001d4968df0 in protocol witness for SwiftUI.LayoutEngine.explicitAlignment(_: SwiftUI.AlignmentKey, at: SwiftUI.ViewSize) -> Swift.Optional in conformance SwiftUI.ViewLayoutEngine : SwiftUI.LayoutEngine in SwiftUI ()
#67 0x00000001d4b70194 in explicitAlignment ()
#68 0x00000001d47d26f0 in explicitAlignment ()
#69 0x00000001d4934c68 in explicitAlignment ()
#70 0x00000001d4934d08 in protocol witness for SwiftUI.LayoutEngine.explicitAlignment(_: SwiftUI.AlignmentKey, at: SwiftUI.ViewSize) -> Swift.Optional in conformance SwiftUI.UnaryLayoutEngine : SwiftUI.LayoutEngine in SwiftUI ()
#71 0x00000001d4b70194 in explicitAlignment ()
#72 0x00000001d4663040 in SwiftUI.ViewDimensions.subscript.getter : (SwiftUI.AlignmentKey) -> CoreGraphics.CGFloat ()
#73 0x00000001d4569c74 in function signature specialization __C.CGPoint in SwiftUI._ZStackLayout.placeSubviews(in: __C.CGRect, proposal: SwiftUI.ProposedViewSize, subviews: SwiftUI.LayoutSubviews, cache: inout ()) -> (), Argument Types : [SwiftUI._ZStackLayout]> of generic specialization , SwiftUI.ViewDimensions>, __C.CGPoint> of Swift.Sequence.reduce(τ_1_0, (τ_1_0, τ_0_0.Element) throws -> τ_1_0) throws -> τ_1_0 ()
#74 0x00000001d458d844 in function signature specialization of SwiftUI._ZStackLayout.placeSubviews(in: __C.CGRect, proposal: SwiftUI.ProposedViewSize, subviews: SwiftUI.LayoutSubviews, cache: inout ()) -> () ()
#75 0x00000001d4967e0c in closure #1 (Swift.UnsafeMutablePointer) -> () in SwiftUI.ViewLayoutEngine.childGeometries(at: SwiftUI.ViewSize, origin: __C.CGPoint) -> Swift.Array ()
#76 0x00000001d4967bb8 in childGeometries ()
#77 0x00000001d4968aa4 in static SwiftUI.ViewLayoutEngine.defaultAlignment(_: SwiftUI.AlignmentKey, size: SwiftUI.ViewSize, data: Swift.UnsafeMutableRawPointer) -> Swift.Optional ()
#78 0x00000001d4968e10 in protocol witness for static SwiftUI.DefaultAlignmentFunction.defaultAlignment(_: SwiftUI.AlignmentKey, size: SwiftUI.ViewSize, data: Swift.UnsafeMutableRawPointer) -> Swift.Optional in conformance SwiftUI.ViewLayoutEngine : SwiftUI.DefaultAlignmentFunction in SwiftUI ()
#79 0x00000001d495287c in merged protocol witness for SwiftUI.Layout.explicitAlignment(of: SwiftUI.HorizontalAlignment, in: __C.CGRect, proposal: SwiftUI.ProposedViewSize, subviews: SwiftUI.LayoutSubviews, cache: inout τ_0_0.Cache) -> Swift.Optional in conformance SwiftUI._ZStackLayout : SwiftUI.Layout in SwiftUI ()
#80 0x00000001d496875c in closure #1 (Swift.UnsafeMutablePointer) -> Swift.Optional in closure #1 (Swift.UnsafeMutablePointer>) -> Swift.Optional in SwiftUI.ViewLayoutEngine.explicitAlignment(_: SwiftUI.AlignmentKey, at: SwiftUI.ViewSize) -> Swift.Optional ()
#81 0x00000001d49684c4 in closure #1 (Swift.UnsafeMutablePointer>) -> Swift.Optional in SwiftUI.ViewLayoutEngine.explicitAlignment(_: SwiftUI.AlignmentKey, at: SwiftUI.ViewSize) -> Swift.Optional ()
#82 0x00000001d496ab24 in partial apply forwarder for closure #1 (Swift.UnsafeMutablePointer>) -> Swift.Optional in SwiftUI.ViewLayoutEngine.explicitAlignment(_: SwiftUI.AlignmentKey, at: SwiftUI.ViewSize) -> Swift.Optional ()
#83 0x00000001d48c9288 in withUnsafePointer ()
#84 0x00000001d496837c in explicitAlignment ()
#85 0x00000001d4968df0 in protocol witness for SwiftUI.LayoutEngine.explicitAlignment(_: SwiftUI.AlignmentKey, at: SwiftUI.ViewSize) -> Swift.Optional in conformance SwiftUI.ViewLayoutEngine : SwiftUI.LayoutEngine in SwiftUI ()
#86 0x00000001d4b70194 in explicitAlignment ()
#87 0x00000001d4663040 in SwiftUI.ViewDimensions.subscript.getter : (SwiftUI.AlignmentKey) -> CoreGraphics.CGFloat ()
#88 0x00000001d4aaa9f0 in generic specialization of SwiftUI.FrameLayoutCommon.commonPlacement(of: SwiftUI.LayoutProxy, in: SwiftUI.PlacementContext, childProposal: SwiftUI._ProposedSize) -> SwiftUI._Placement ()
#89 0x00000001d49336cc in generic specialization of SwiftUI.UnaryLayoutEngine.childPlacement(at: SwiftUI.ViewSize) -> SwiftUI._Placement ()
#90 0x00000001d4947910 in partial apply forwarder for generic specialization of closure #1 (inout SwiftUI.UnaryLayoutEngine) -> SwiftUI._Placement in SwiftUI.UnaryChildGeometry.value.getter : SwiftUI.ViewGeometry ()
#91 0x00000001d48c33f0 in partial apply forwarder for generic specialization , SwiftUI._Placement> of closure #1 (inout τ_0_0) -> τ_0_1 in SwiftUI.LayoutComputer.withMutableEngine(type: τ_0_0.Type, do: (inout τ_0_0) -> τ_0_1) -> τ_0_1 ()
#92 0x00000001d4b70d10 in partial apply forwarder for closure #1 (Swift.UnsafeMutablePointer) -> τ_1_1 in SwiftUI.LayoutEngineBox.mutateEngine(as: τ_1_0.Type, do: (inout τ_1_0) -> τ_1_1) -> τ_1_1 ()
#93 0x00000001d48c9288 in withUnsafePointer ()
#94 0x00000001d4b6fe08 in mutateEngine ()
#95 0x00000001d49318d4 in generic specialization of SwiftUI.UnaryChildGeometry.value.getter : SwiftUI.ViewGeometry ()
#96 0x00000001d49413a4 in merged generic specialization > of implicit closure #1 (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 () -> (Swift.UnsafeMutableRawPointer, __C.AGAttribute) -> () in closure #1 (Swift.UnsafePointer) -> AttributeGraph.Attribute in AttributeGraph.Attribute.init(τ_1_0) -> AttributeGraph.Attribute ()
#97 0x00000001c00ca438 in AG::Graph::UpdateStack::update ()
#98 0x00000001c00cac04 in AG::Graph::update_attribute ()
#99 0x00000001c00d80b4 in AG::Subgraph::update ()
#100 0x00000001d4d6f118 in SwiftUI.ViewGraph.updateOutputs(async: Swift.Bool) -> () ()
#101 0x00000001d4d6f618 in closure #2 () -> () in SwiftUI.ViewGraph.updateOutputsAsync(at: SwiftUI.Time) -> Swift.Optional ()
#102 0x00000001c00e70f8 in AGGraphWithMainThreadHandler ()
#103 0x00000001d4d69a90 in updateOutputsAsync ()
#104 0x00000001d4d643c4 in renderAsync ()
#105 0x00000001d3b436d4 in displayLinkTimer ()
#106 0x00000001d3b43eb4 in SwiftUI.DisplayLink.displayLinkTimer(__C.CADisplayLink) -> () ()
#107 0x00000001d3b444c0 in @objc SwiftUI.DisplayLink.displayLinkTimer(__C.CADisplayLink) -> () ()
#108 0x000000018b3e2e44 in CA::Display::DisplayLinkItem::dispatch_ ()
#109 0x000000018b3def44 in CA::Display::DisplayLink::dispatch_items ()
#110 0x000000018b4e7a40 in display_timer_callback ()
#111 0x00000001803ed914 in __CFMachPortPerform ()
#112 0x0000000180429a6c in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#113 0x0000000180429084 in __CFRunLoopDoSource1 ()
#114 0x000000018042397c in __CFRunLoopRun ()
#115 0x0000000180422cec in CFRunLoopRunSpecific ()
#116 0x0000000180f0e38c in -[NSRunLoop(NSRunLoop) runMode:beforeDate:] ()
#117 0x0000000180f0e55c in -[NSRunLoop(NSRunLoop) run] ()
#118 0x00000001d3b45830 in function signature specialization of static SwiftUI.DisplayLink.asyncThread(arg: Swift.Optional) -> () ()
#119 0x00000001d3b44520 in @objc static SwiftUI.DisplayLink.asyncThread(arg: Swift.Optional) -> () ()
#120 0x0000000180f35148 in __NSThread__start__ ()
#121 0x0000000102cee5f0 in _pthread_start ()
The warning that is seen when running on the iPhone 15 simulator with iOS 17.5 is as follows:
warning: data race detected: @MainActor function at StackOverflow/ContentView.swift:52 was not called on the main thread
Line 52 is the ForEach inside the function itemList.
It seems to me that this must be a SwiftUI bug, especially since it is only under certain circumstances. For example, the issue is not seen when any of the following changes are made:
- a different text size is used
- the second text item is shorter (1 line instead of 3)
- any 1 of the 3 views inside ViewthatFits is commented out
- vertical padding is added to the chevron
- the chevron is removed from view.
How can the code be fixed so that the issues are not seen when running as described?