Token导航 LogoToken导航

Agent Skill · 研究检索

debug_swiftui(调试 swiftui)

debug_swiftui 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

debug_swiftui 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为权限未标注;许可证为 MIT,暂无第三方扫描结果,按安装量在研究检索类的 73,675 个 Skill 里排第 43,282。

总安装 998周安装 40GitHub Stars 公开资料未说明下载 323核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:debug_swiftui(调试 swiftui)
来源仓库:https://github.com/snakeo/claude-debug-and-refactor-skills-plugin
仓库路径:skills/debug_swiftui
安装命令:
npx skills add snakeo/claude-debug-and-refactor-skills-plugin --skill "debug:swiftui"
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

AgentSkills.tonpx skills
npx skills add snakeo/claude-debug-and-refactor-skills-plugin --skill "debug:swiftui"

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

debug_swiftui 提供 SwiftUI iOS/macOS 应用的调试支持。适用于声明式 UI 和原生组件开发分析。需确认 Xcode 项目和模拟器配置。debug_swiftui 属于研究检索类 Skill,可作为该场景下的辅助能力补充。涉及真机调试时,应区分开发证书与发布环境。

建议结合 Instruments 工具验证性能与内存使用。

来源仓库内路径:skills/debug_swiftui

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add snakeo/claude-debug-and-refactor-skills-plugin --skill "debug:swi…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    权限没有明确标注,第一次使用时只给一个无关紧要的任务,观察它到底读了哪些文件和网络。

常见问题

6 条

debug_swiftui 怎么安装?

在终端执行 npx skills add snakeo/claude-debug-and-refactor-skills-plugin --skill "debug:swiftui"。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

debug_swiftui 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

debug_swiftui 需要什么权限?

权限级别没有明确标注。第一次使用时建议只给无关紧要的任务,观察它实际读写了哪些内容。

debug_swiftui 是免费的吗?

来源标注的许可证是 MIT。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

debug_swiftui 用的人多吗?

公开数据是累计安装 998 次,近一周安装 40 次,下载 323 次。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

debug_swiftui 安全吗?

没有查到第三方扫描结果,安全性无法从公开资料判断,安装前请自行审查源码、依赖和命令行为。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 许可证明确为 MIT,商用和分发边界好判断。

先想清楚的地方

  • 没有第三方扫描结果,安全性只能靠自己读源码判断。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 要求有安全扫描结论才肯安装的团队。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
debug_swiftui

调试 swiftui · 本页

998—权限未标注MIT未收录

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

SwiftUI Debugging Guide

A comprehensive guide for systematically debugging SwiftUI applications, covering common error patterns, debugging tools, and step-by-step resolution strategies.

Common Error Patterns

1. View Not Updating

Symptoms:

  • UI doesn't reflect state changes
  • Data updates but view remains stale
  • Animations don't trigger

Root Causes:

  • Missing @Published on ObservableObject properties
  • Using wrong property wrapper (@State vs @Binding vs @ObservedObject)
  • Mutating state on background thread
  • Object reference not triggering SwiftUI's change detection

Solutions:

// Ensure @Published is used for observable properties
class ViewModel: ObservableObject {
    @Published var items: [Item] = []  // Correct
    var count: Int = 0  // Won't trigger updates
}

// Force view refresh with id modifier
List(items) { item in
    ItemRow(item: item)
}
.id(UUID())  // Forces complete rebuild

// Update state on main thread
DispatchQueue.main.async {
    self.viewModel.items = newItems
}

2. @State/@Binding Issues

Symptoms:

  • Child view changes don't propagate to parent
  • State resets unexpectedly
  • Two-way binding doesn't work

Solutions:

// Parent view
struct ParentView: View {
    @State private var isOn = false

    var body: some View {
        ChildView(isOn: $isOn)  // Pass binding with $
    }
}

// Child view
struct ChildView: View {
    @Binding var isOn: Bool  // Use @Binding, not @State

    var body: some View {
        Toggle("Toggle", isOn: $isOn)
    }
}

3. NavigationStack Problems

Symptoms:

  • Navigation doesn't work
  • Back button missing
  • Destination view not appearing
  • Deprecated NavigationView warnings

Solutions:

// iOS 16+ use NavigationStack
NavigationStack {
    List(items) { item in
        NavigationLink(value: item) {
            Text(item.name)
        }
    }
    .navigationDestination(for: Item.self) { item in
        DetailView(item: item)
    }
}

// For programmatic navigation
@State private var path = NavigationPath()

NavigationStack(path: $path) {
    // ...
}

// Navigate programmatically
path.append(item)

4. Memory Leaks with Closures

Symptoms:

  • Memory usage grows over time
  • Deinit never called
  • Retain cycles in view models

Solutions:

// Use [weak self] in closures
viewModel.fetchData { [weak self] result in
    guard let self = self else { return }
    self.handleResult(result)
}

// For Combine subscriptions, store cancellables
private var cancellables = Set<AnyCancellable>()

publisher
    .sink { [weak self] value in
        self?.handleValue(value)
    }
    .store(in: &cancellables)

5. Preview Crashes

Symptoms:

  • Canvas shows "Preview crashed"
  • "Cannot preview in this file"
  • Slow or unresponsive previews

Solutions:

// Provide mock data for previews
#Preview {
    ContentView()
        .environmentObject(MockViewModel())
}

// Use @available to exclude preview-incompatible code
#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .previewDevice("iPhone 15 Pro")
    }
}
#endif

// Simplify preview environment
#Preview {
    ContentView()
        .modelContainer(for: Item.self, inMemory: true)
}

6. Combine Publisher Issues

Symptoms:

  • Publisher never emits
  • Multiple subscriptions
  • Memory leaks
  • Values emitted on wrong thread

Solutions:

// Ensure receiving on main thread for UI updates
publisher
    .receive(on: DispatchQueue.main)
    .sink { value in
        self.updateUI(value)
    }
    .store(in: &cancellables)

// Debug publisher chain
publisher
    .print("DEBUG")  // Prints all events
    .handleEvents(
        receiveSubscription: { _ in print("Subscribed") },
        receiveOutput: { print("Output: \($0)") },
        receiveCompletion: { print("Completed: \($0)") },
        receiveCancel: { print("Cancelled") }
    )
    .sink { _ in }
    .store(in: &cancellables)

7. Compiler Type-Check Errors

Symptoms:

  • "The compiler is unable to type-check this expression in reasonable time"
  • Generic error messages on wrong line
  • Build times extremely slow

Solutions:

// Break complex views into smaller components
// BAD: Complex inline logic
var body: some View {
    VStack {
        if condition1 && condition2 || condition3 {
            // Lots of nested views...
        }
    }
}

// GOOD: Extract to computed properties or subviews
var body: some View {
    VStack {
        conditionalContent
    }
}

@ViewBuilder
private var conditionalContent: some View {
    if shouldShowContent {
        ContentSubview()
    }
}

8. Animation Issues

Symptoms:

  • Animations not playing
  • Jerky or stuttering animations
  • Wrong elements animating

Solutions:

// Use withAnimation for explicit control
Button("Toggle") {
    withAnimation(.spring()) {
        isExpanded.toggle()
    }
}

// Apply animation to specific value
Rectangle()
    .frame(width: isExpanded ? 200 : 100)
    .animation(.easeInOut, value: isExpanded)

// Use transaction for fine-grained control
var transaction = Transaction(animation: .easeInOut)
transaction.disablesAnimations = false
withTransaction(transaction) {
    isExpanded.toggle()
}

Debugging Tools

Xcode Debugger

Breakpoints:

// Conditional breakpoint
// Right-click breakpoint > Edit Breakpoint > Condition: items.count > 10

// Symbolic breakpoint for SwiftUI layout issues
// Debug > Breakpoints > Create Symbolic Breakpoint
// Symbol: UIViewAlertForUnsatisfiableConstraints

LLDB Commands:

# Print view hierarchy
po view.value(forKey: "recursiveDescription")

# Print SwiftUI view
po self

# Examine memory
memory read --size 8 --format x 0x12345678

# Find retain cycles
leaks --outputGraph=/tmp/leaks.memgraph [PID]

Instruments

Allocations:

  • Track memory usage over time
  • Identify objects not being deallocated
  • Find retain cycles

Time Profiler:

  • Identify slow code paths
  • Find main thread blocking
  • Optimize view rendering

SwiftUI Instruments (Xcode 15+):

  • View body evaluations
  • View identity tracking
  • State change tracking

Print Debugging

// Track view redraws
var body: some View {
    let _ = Self._printChanges()  // Prints what caused redraw
    Text("Hello")
}

// Conditional debug printing
#if DEBUG
func debugPrint(_ items: Any...) {
    print(items)
}
#else
func debugPrint(_ items: Any...) {}
#endif

// os_log for structured logging
import os.log

let logger = Logger(subsystem: "com.app.name", category: "networking")
logger.debug("Request started: \(url)")
logger.error("Request failed: \(error.localizedDescription)")

View Hierarchy Debugger

  1. Run app in simulator/device
  2. Click "Debug View Hierarchy" button in Xcode
  3. Use 3D view to inspect layer structure
  4. Check for overlapping views, incorrect frames

Environment Inspection

// Print all environment values
struct DebugEnvironmentView: View {
    @Environment(\.self) var environment

    var body: some View {
        let _ = print(environment)
        Text("Debug")
    }
}

The Four Phases (SwiftUI-Specific)

Phase 1: Reproduce and Isolate

  1. Create minimal reproduction

- Strip away unrelated code - Use fresh SwiftUI project if needed - Test in Preview vs Simulator vs Device

  1. Identify trigger conditions

- When does the bug occur? - What user actions trigger it? - Is it state-dependent?

  1. Check iOS version specifics

- Does it happen on all iOS versions? - Is it simulator-only or device-only?

Phase 2: Diagnose

  1. Use Self._printChanges() var body: some View {let _ = Self._printChanges() // Your view content}
  2. Add strategic breakpoints

- Body property - State mutations - Network callbacks

  1. Check property wrapper usage

- @State for view-local state - @Binding for parent-child communication - @StateObject for owned ObservableObject - @ObservedObject for passed ObservableObject - @EnvironmentObject for dependency injection

  1. Verify threading // Check if on main thread assert(Thread.isMainThread, "Must be on main thread")

Phase 3: Fix

  1. Apply targeted fix

- Fix one issue at a time - Don't introduce new property wrappers unnecessarily

  1. Test the fix

- Verify in Preview - Test in Simulator - Test on physical device - Test edge cases

  1. Check for side effects

- Run existing tests - Verify related features still work

Phase 4: Prevent

  1. Add unit tests func testViewModelUpdatesState() async {let viewModel = ViewModel() await viewModel.fetchData() XCTAssertEqual(viewModel.items.count, 10)}
  2. Add UI tests func testNavigationFlow() {let app = XCUIApplication() app.launch() app.buttons["DetailButton"].tap() XCTAssertTrue(app.staticTexts["DetailView"].exists)}
  3. Document the fix

- Add code comments explaining why - Update team documentation

Quick Reference Commands

Xcode Shortcuts

ShortcutAction
Cmd + RRun
Cmd + BBuild
Cmd + URun tests
Cmd + Shift + KClean build folder
Cmd + Option + PResume preview
Cmd + 7Show debug navigator
Cmd + 8Show breakpoint navigator

Common Debug Snippets

// Force view identity reset
.id(someValue)

// Track view lifecycle
.onAppear { print("View appeared") }
.onDisappear { print("View disappeared") }
.task { print("Task started") }

// Debug layout
.border(Color.red)  // See frame boundaries
.background(Color.blue.opacity(0.3))

// Debug geometry
.background(GeometryReader { geo in
    Color.clear.onAppear {
        print("Size: \(geo.size)")
        print("Frame: \(geo.frame(in: .global))")
    }
})

// Debug state changes
.onChange(of: someState) { oldValue, newValue in
    print("State changed from \(oldValue) to \(newValue)")
}

Build Settings for Debugging

// In scheme > Run > Arguments > Environment Variables
OS_ACTIVITY_MODE = disable  // Reduce console noise
DYLD_PRINT_STATISTICS = 1   // Print launch time stats

Memory Debugging

// Add to class to track deallocation
deinit {
    print("\(Self.self) deinit")
}

// Enable Zombie Objects
// Edit Scheme > Run > Diagnostics > Zombie Objects

// Enable Address Sanitizer
// Edit Scheme > Run > Diagnostics > Address Sanitizer

Resources

平台分布

OpenCode

30.13%
按下载量换算97

Claude Code

22.58%
按下载量换算73

Antigravity

16%
按下载量换算52

windsurf

12.53%
按下载量换算40

Codex

8.08%
按下载量换算26

Gemini CLI

3.64%
按下载量换算12

安全审计

暂无安全审计结果可展示。

权限和风险

权限未标注

当前来源未能明确判断权限范围,默认进入异常复核队列。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills