aigroup-workflow 2.2.1 → 2.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/fix-build.md +10 -5
- package/.claude/commands/init-project.md +13 -8
- package/.claude/commands/plan.md +15 -8
- package/.claude/commands/review.md +12 -6
- package/.claude/commands/tdd.md +11 -5
- package/.claude/commands/workflow-start.md +20 -11
- package/.claude/settings.json +28 -0
- package/.codex/agents/architect.toml +207 -0
- package/.codex/agents/build-error-resolver.toml +110 -0
- package/.codex/agents/code-reviewer.toml +233 -0
- package/.codex/agents/doc-updater.toml +103 -0
- package/.codex/agents/e2e-runner.toml +103 -0
- package/.codex/agents/get-current-datetime.toml +23 -0
- package/.codex/agents/init-architect.toml +181 -0
- package/.codex/agents/planner.toml +208 -0
- package/.codex/agents/refactor-cleaner.toml +81 -0
- package/.codex/agents/rust-reviewer.toml +90 -0
- package/.codex/agents/security-reviewer.toml +104 -0
- package/.codex/agents/tdd-guide.toml +87 -0
- package/AGENTS.md +2 -2
- package/CLAUDE.md +23 -1
- package/LICENSE +20 -20
- package/README.md +333 -333
- package/agents/a11y-architect.md +141 -141
- package/agents/architect.md +211 -211
- package/agents/build-error-resolver.md +114 -114
- package/agents/chief-of-staff.md +151 -151
- package/agents/code-architect.md +71 -71
- package/agents/code-explorer.md +69 -69
- package/agents/code-reviewer.md +237 -237
- package/agents/code-simplifier.md +47 -47
- package/agents/comment-analyzer.md +45 -45
- package/agents/conversation-analyzer.md +52 -52
- package/agents/cpp-build-resolver.md +90 -90
- package/agents/cpp-reviewer.md +72 -72
- package/agents/csharp-reviewer.md +101 -101
- package/agents/dart-build-resolver.md +201 -201
- package/agents/database-reviewer.md +91 -91
- package/agents/doc-updater.md +107 -107
- package/agents/docs-lookup.md +68 -68
- package/agents/e2e-runner.md +107 -107
- package/agents/flutter-reviewer.md +243 -243
- package/agents/gan-evaluator.md +209 -209
- package/agents/gan-generator.md +131 -131
- package/agents/gan-planner.md +99 -99
- package/agents/get-current-datetime.md +26 -26
- package/agents/go-build-resolver.md +94 -94
- package/agents/go-reviewer.md +76 -76
- package/agents/harness-optimizer.md +35 -35
- package/agents/healthcare-reviewer.md +83 -83
- package/agents/java-build-resolver.md +153 -153
- package/agents/java-reviewer.md +92 -92
- package/agents/kotlin-build-resolver.md +118 -118
- package/agents/kotlin-reviewer.md +159 -159
- package/agents/loop-operator.md +36 -36
- package/agents/opensource-forker.md +198 -198
- package/agents/opensource-packager.md +249 -249
- package/agents/opensource-sanitizer.md +188 -188
- package/agents/performance-optimizer.md +446 -446
- package/agents/planner.md +212 -212
- package/agents/pr-test-analyzer.md +45 -45
- package/agents/python-reviewer.md +98 -98
- package/agents/pytorch-build-resolver.md +120 -120
- package/agents/refactor-cleaner.md +85 -85
- package/agents/rust-build-resolver.md +148 -148
- package/agents/rust-reviewer.md +94 -94
- package/agents/security-reviewer.md +108 -108
- package/agents/seo-specialist.md +59 -59
- package/agents/silent-failure-hunter.md +50 -50
- package/agents/tdd-guide.md +91 -91
- package/agents/type-design-analyzer.md +41 -41
- package/agents/typescript-reviewer.md +112 -112
- package/cli/commands/update.mjs +1 -1
- package/cli/utils/scaffold.mjs +53 -0
- package/docs/rules/agents.md +166 -50
- package/docs/rules/cpp/coding-style.md +44 -44
- package/docs/rules/cpp/hooks.md +39 -39
- package/docs/rules/cpp/patterns.md +51 -51
- package/docs/rules/cpp/security.md +51 -51
- package/docs/rules/cpp/testing.md +44 -44
- package/docs/rules/csharp/coding-style.md +72 -72
- package/docs/rules/csharp/hooks.md +25 -25
- package/docs/rules/csharp/patterns.md +50 -50
- package/docs/rules/csharp/security.md +58 -58
- package/docs/rules/csharp/testing.md +46 -46
- package/docs/rules/dart/coding-style.md +159 -159
- package/docs/rules/dart/hooks.md +66 -66
- package/docs/rules/dart/patterns.md +261 -261
- package/docs/rules/dart/security.md +135 -135
- package/docs/rules/dart/testing.md +215 -215
- package/docs/rules/golang/coding-style.md +32 -32
- package/docs/rules/golang/hooks.md +17 -17
- package/docs/rules/golang/patterns.md +45 -45
- package/docs/rules/golang/security.md +34 -34
- package/docs/rules/golang/testing.md +31 -31
- package/docs/rules/java/coding-style.md +114 -114
- package/docs/rules/java/hooks.md +18 -18
- package/docs/rules/java/patterns.md +146 -146
- package/docs/rules/java/security.md +100 -100
- package/docs/rules/java/testing.md +131 -131
- package/docs/rules/kotlin/coding-style.md +86 -86
- package/docs/rules/kotlin/hooks.md +17 -17
- package/docs/rules/kotlin/patterns.md +146 -146
- package/docs/rules/kotlin/security.md +82 -82
- package/docs/rules/kotlin/testing.md +128 -128
- package/docs/rules/perl/coding-style.md +46 -46
- package/docs/rules/perl/hooks.md +22 -22
- package/docs/rules/perl/patterns.md +76 -76
- package/docs/rules/perl/security.md +69 -69
- package/docs/rules/perl/testing.md +54 -54
- package/docs/rules/php/coding-style.md +40 -40
- package/docs/rules/php/hooks.md +24 -24
- package/docs/rules/php/patterns.md +33 -33
- package/docs/rules/php/security.md +37 -37
- package/docs/rules/php/testing.md +39 -39
- package/docs/rules/python/coding-style.md +42 -42
- package/docs/rules/python/hooks.md +19 -19
- package/docs/rules/python/patterns.md +39 -39
- package/docs/rules/python/security.md +30 -30
- package/docs/rules/python/testing.md +38 -38
- package/docs/rules/rust/coding-style.md +151 -151
- package/docs/rules/rust/hooks.md +16 -16
- package/docs/rules/rust/patterns.md +168 -168
- package/docs/rules/rust/security.md +141 -141
- package/docs/rules/rust/testing.md +154 -154
- package/docs/rules/swift/coding-style.md +47 -47
- package/docs/rules/swift/hooks.md +20 -20
- package/docs/rules/swift/patterns.md +66 -66
- package/docs/rules/swift/security.md +33 -33
- package/docs/rules/swift/testing.md +45 -45
- package/docs/rules/typescript/coding-style.md +199 -199
- package/docs/rules/typescript/hooks.md +22 -22
- package/docs/rules/typescript/patterns.md +52 -52
- package/docs/rules/typescript/security.md +28 -28
- package/docs/rules/typescript/testing.md +18 -18
- package/docs/rules/web/coding-style.md +96 -96
- package/docs/rules/web/design-quality.md +62 -62
- package/docs/rules/web/hooks.md +120 -120
- package/docs/rules/web/patterns.md +79 -79
- package/docs/rules/web/performance.md +64 -64
- package/docs/rules/web/security.md +57 -57
- package/docs/rules/web/testing.md +55 -55
- package/docs/templates/README.md +36 -36
- package/docs/templates/ai-project-final.md +124 -124
- package/docs/templates/ai-project.md +105 -105
- package/docs/templates/api.md +157 -157
- package/docs/templates/bug.md +62 -62
- package/docs/templates/code-review.md +87 -87
- package/docs/templates/generic.md +116 -116
- package/docs/templates/implementation-plan.md +1 -1
- package/docs/templates/meeting.md +68 -68
- package/docs/templates/prd.md +98 -98
- package/docs/templates/ui.md +134 -134
- package/docs/workflow-pipeline.md +5 -5
- package/package.json +40 -39
- package/skills/SUPERPOWERS-LICENSE +21 -21
- package/skills/ai-ml/fine-tuning-expert/SKILL.md +162 -162
- package/skills/ai-ml/fine-tuning-expert/references/dataset-preparation.md +540 -540
- package/skills/ai-ml/fine-tuning-expert/references/deployment-optimization.md +673 -673
- package/skills/ai-ml/fine-tuning-expert/references/evaluation-metrics.md +597 -597
- package/skills/ai-ml/fine-tuning-expert/references/hyperparameter-tuning.md +565 -565
- package/skills/ai-ml/fine-tuning-expert/references/lora-peft.md +347 -347
- package/skills/ai-ml/ml-pipeline/SKILL.md +159 -159
- package/skills/ai-ml/ml-pipeline/references/experiment-tracking.md +833 -833
- package/skills/ai-ml/ml-pipeline/references/feature-engineering.md +631 -631
- package/skills/ai-ml/ml-pipeline/references/model-validation.md +978 -978
- package/skills/ai-ml/ml-pipeline/references/pipeline-orchestration.md +907 -907
- package/skills/ai-ml/ml-pipeline/references/training-pipelines.md +782 -782
- package/skills/ai-ml/rag-architect/SKILL.md +194 -194
- package/skills/ai-ml/rag-architect/references/chunking-strategies.md +878 -878
- package/skills/ai-ml/rag-architect/references/embedding-models.md +561 -561
- package/skills/ai-ml/rag-architect/references/rag-evaluation.md +833 -833
- package/skills/ai-ml/rag-architect/references/retrieval-optimization.md +795 -795
- package/skills/ai-ml/rag-architect/references/vector-databases.md +589 -589
- package/skills/ai-ml/spark-engineer/SKILL.md +148 -148
- package/skills/ai-ml/spark-engineer/references/partitioning-caching.md +543 -543
- package/skills/ai-ml/spark-engineer/references/performance-tuning.md +544 -544
- package/skills/ai-ml/spark-engineer/references/rdd-operations.md +599 -599
- package/skills/ai-ml/spark-engineer/references/spark-sql-dataframes.md +474 -474
- package/skills/ai-ml/spark-engineer/references/streaming-patterns.md +786 -786
- package/skills/backend/api-designer/SKILL.md +217 -217
- package/skills/backend/api-designer/references/error-handling.md +541 -541
- package/skills/backend/api-designer/references/openapi.md +824 -824
- package/skills/backend/api-designer/references/pagination.md +494 -494
- package/skills/backend/api-designer/references/rest-patterns.md +335 -335
- package/skills/backend/api-designer/references/versioning.md +391 -391
- package/skills/backend/architecture-designer/SKILL.md +117 -117
- package/skills/backend/architecture-designer/references/adr-template.md +116 -116
- package/skills/backend/architecture-designer/references/architecture-patterns.md +111 -111
- package/skills/backend/architecture-designer/references/database-selection.md +102 -102
- package/skills/backend/architecture-designer/references/nfr-checklist.md +112 -112
- package/skills/backend/architecture-designer/references/system-design.md +100 -100
- package/skills/backend/code-documenter/SKILL.md +147 -147
- package/skills/backend/code-documenter/references/api-docs-fastapi-django.md +166 -166
- package/skills/backend/code-documenter/references/api-docs-nestjs-express.md +220 -220
- package/skills/backend/code-documenter/references/coverage-reports.md +125 -125
- package/skills/backend/code-documenter/references/documentation-systems.md +333 -333
- package/skills/backend/code-documenter/references/interactive-api-docs.md +531 -531
- package/skills/backend/code-documenter/references/python-docstrings.md +121 -121
- package/skills/backend/code-documenter/references/typescript-jsdoc.md +145 -145
- package/skills/backend/code-documenter/references/user-guides-tutorials.md +530 -530
- package/skills/backend/debugging-wizard/SKILL.md +105 -105
- package/skills/backend/debugging-wizard/references/common-patterns.md +132 -132
- package/skills/backend/debugging-wizard/references/debugging-tools.md +140 -140
- package/skills/backend/debugging-wizard/references/quick-fixes.md +177 -177
- package/skills/backend/debugging-wizard/references/strategies.md +142 -142
- package/skills/backend/debugging-wizard/references/systematic-debugging.md +367 -367
- package/skills/backend/feature-forge/SKILL.md +98 -98
- package/skills/backend/feature-forge/references/acceptance-criteria.md +104 -104
- package/skills/backend/feature-forge/references/ears-syntax.md +99 -99
- package/skills/backend/feature-forge/references/interview-questions.md +150 -150
- package/skills/backend/feature-forge/references/pre-discovery-subagents.md +54 -54
- package/skills/backend/feature-forge/references/specification-template.md +103 -103
- package/skills/backend/fullstack-guardian/SKILL.md +105 -105
- package/skills/backend/fullstack-guardian/references/api-design-standards.md +307 -307
- package/skills/backend/fullstack-guardian/references/architecture-decisions.md +350 -350
- package/skills/backend/fullstack-guardian/references/backend-patterns.md +237 -237
- package/skills/backend/fullstack-guardian/references/common-patterns.md +134 -134
- package/skills/backend/fullstack-guardian/references/deliverables-checklist.md +354 -354
- package/skills/backend/fullstack-guardian/references/design-template.md +91 -91
- package/skills/backend/fullstack-guardian/references/error-handling.md +135 -135
- package/skills/backend/fullstack-guardian/references/frontend-patterns.md +340 -340
- package/skills/backend/fullstack-guardian/references/integration-patterns.md +333 -333
- package/skills/backend/fullstack-guardian/references/security-checklist.md +106 -106
- package/skills/backend/graphql-architect/SKILL.md +146 -146
- package/skills/backend/graphql-architect/references/federation.md +418 -418
- package/skills/backend/graphql-architect/references/migration-from-rest.md +1141 -1141
- package/skills/backend/graphql-architect/references/resolvers.md +425 -425
- package/skills/backend/graphql-architect/references/schema-design.md +393 -393
- package/skills/backend/graphql-architect/references/security.md +569 -569
- package/skills/backend/graphql-architect/references/subscriptions.md +510 -510
- package/skills/backend/legacy-modernizer/SKILL.md +137 -137
- package/skills/backend/legacy-modernizer/references/legacy-testing.md +381 -381
- package/skills/backend/legacy-modernizer/references/migration-strategies.md +423 -423
- package/skills/backend/legacy-modernizer/references/refactoring-patterns.md +395 -395
- package/skills/backend/legacy-modernizer/references/strangler-fig-pattern.md +281 -281
- package/skills/backend/legacy-modernizer/references/system-assessment.md +487 -487
- package/skills/backend/microservices-architect/SKILL.md +164 -164
- package/skills/backend/microservices-architect/references/communication.md +499 -499
- package/skills/backend/microservices-architect/references/data.md +721 -721
- package/skills/backend/microservices-architect/references/decomposition.md +344 -344
- package/skills/backend/microservices-architect/references/observability.md +805 -805
- package/skills/backend/microservices-architect/references/patterns.md +603 -603
- package/skills/database/database-optimizer/SKILL.md +147 -147
- package/skills/database/database-optimizer/references/index-strategies.md +331 -331
- package/skills/database/database-optimizer/references/monitoring-analysis.md +501 -501
- package/skills/database/database-optimizer/references/mysql-tuning.md +452 -452
- package/skills/database/database-optimizer/references/postgresql-tuning.md +413 -413
- package/skills/database/database-optimizer/references/query-optimization.md +251 -251
- package/skills/database/postgres-pro/SKILL.md +152 -152
- package/skills/database/postgres-pro/references/extensions.md +404 -404
- package/skills/database/postgres-pro/references/jsonb.md +321 -321
- package/skills/database/postgres-pro/references/maintenance.md +481 -481
- package/skills/database/postgres-pro/references/performance.md +265 -265
- package/skills/database/postgres-pro/references/replication.md +446 -446
- package/skills/database/sql-pro/SKILL.md +129 -129
- package/skills/database/sql-pro/references/database-design.md +402 -402
- package/skills/database/sql-pro/references/dialect-differences.md +419 -419
- package/skills/database/sql-pro/references/optimization.md +384 -384
- package/skills/database/sql-pro/references/query-patterns.md +285 -285
- package/skills/database/sql-pro/references/window-functions.md +328 -328
- package/skills/dotnet/csharp-developer/SKILL.md +125 -125
- package/skills/dotnet/csharp-developer/references/aspnet-core.md +394 -394
- package/skills/dotnet/csharp-developer/references/blazor.md +553 -553
- package/skills/dotnet/csharp-developer/references/entity-framework.md +409 -409
- package/skills/dotnet/csharp-developer/references/modern-csharp.md +248 -248
- package/skills/dotnet/csharp-developer/references/performance.md +498 -498
- package/skills/dotnet/dotnet-core-expert/SKILL.md +138 -138
- package/skills/dotnet/dotnet-core-expert/references/authentication.md +546 -546
- package/skills/dotnet/dotnet-core-expert/references/clean-architecture.md +455 -455
- package/skills/dotnet/dotnet-core-expert/references/cloud-native.md +548 -548
- package/skills/dotnet/dotnet-core-expert/references/entity-framework.md +440 -440
- package/skills/dotnet/dotnet-core-expert/references/minimal-apis.md +319 -319
- package/skills/frontend/angular-architect/SKILL.md +152 -152
- package/skills/frontend/angular-architect/references/components.md +297 -297
- package/skills/frontend/angular-architect/references/ngrx.md +401 -401
- package/skills/frontend/angular-architect/references/routing.md +361 -361
- package/skills/frontend/angular-architect/references/rxjs.md +319 -319
- package/skills/frontend/angular-architect/references/testing.md +405 -405
- package/skills/frontend/design-commands/design.md +91 -91
- package/skills/frontend/design-commands/handoff.md +97 -97
- package/skills/frontend/design-commands/prototype.md +120 -120
- package/skills/frontend/design-commands/spec.md +160 -160
- package/skills/frontend/design-commands/style.md +78 -78
- package/skills/frontend/flutter-expert/SKILL.md +138 -138
- package/skills/frontend/flutter-expert/references/bloc-state.md +259 -259
- package/skills/frontend/flutter-expert/references/gorouter-navigation.md +119 -119
- package/skills/frontend/flutter-expert/references/performance.md +99 -99
- package/skills/frontend/flutter-expert/references/project-structure.md +118 -118
- package/skills/frontend/flutter-expert/references/riverpod-state.md +130 -130
- package/skills/frontend/flutter-expert/references/widget-patterns.md +123 -123
- package/skills/frontend/nextjs-developer/SKILL.md +143 -143
- package/skills/frontend/nextjs-developer/references/app-router.md +311 -311
- package/skills/frontend/nextjs-developer/references/data-fetching.md +482 -482
- package/skills/frontend/nextjs-developer/references/deployment.md +545 -545
- package/skills/frontend/nextjs-developer/references/server-actions.md +462 -462
- package/skills/frontend/nextjs-developer/references/server-components.md +384 -384
- package/skills/frontend/react-expert/SKILL.md +149 -149
- package/skills/frontend/react-expert/references/hooks-patterns.md +162 -162
- package/skills/frontend/react-expert/references/migration-class-to-modern.md +1119 -1119
- package/skills/frontend/react-expert/references/performance.md +168 -168
- package/skills/frontend/react-expert/references/react-19-features.md +174 -174
- package/skills/frontend/react-expert/references/server-components.md +143 -143
- package/skills/frontend/react-expert/references/state-management.md +171 -171
- package/skills/frontend/react-expert/references/testing-react.md +174 -174
- package/skills/frontend/react-native-expert/SKILL.md +185 -185
- package/skills/frontend/react-native-expert/references/expo-router.md +187 -187
- package/skills/frontend/react-native-expert/references/list-optimization.md +204 -204
- package/skills/frontend/react-native-expert/references/platform-handling.md +188 -188
- package/skills/frontend/react-native-expert/references/project-structure.md +171 -171
- package/skills/frontend/react-native-expert/references/storage-hooks.md +173 -173
- package/skills/frontend/senior-frontend/SKILL.md +477 -477
- package/skills/frontend/senior-frontend/references/frontend_best_practices.md +806 -806
- package/skills/frontend/senior-frontend/references/nextjs_optimization_guide.md +724 -724
- package/skills/frontend/senior-frontend/references/react_patterns.md +746 -746
- package/skills/frontend/senior-frontend/scripts/bundle_analyzer.py +407 -407
- package/skills/frontend/senior-frontend/scripts/component_generator.py +329 -329
- package/skills/frontend/senior-frontend/scripts/frontend_scaffolder.py +1005 -1005
- package/skills/frontend/ui-ux-pro-max/SKILL.md +386 -386
- package/skills/frontend/ui-ux-pro-max/data/charts.csv +26 -26
- package/skills/frontend/ui-ux-pro-max/data/colors.csv +97 -97
- package/skills/frontend/ui-ux-pro-max/data/icons.csv +101 -101
- package/skills/frontend/ui-ux-pro-max/data/landing.csv +31 -31
- package/skills/frontend/ui-ux-pro-max/data/products.csv +96 -96
- package/skills/frontend/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/skills/frontend/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/skills/frontend/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/skills/frontend/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/skills/frontend/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/skills/frontend/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/skills/frontend/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/skills/frontend/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/skills/frontend/ui-ux-pro-max/data/styles.csv +68 -68
- package/skills/frontend/ui-ux-pro-max/data/typography.csv +57 -57
- package/skills/frontend/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/skills/frontend/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/skills/frontend/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/skills/frontend/ui-ux-pro-max/scripts/core.py +253 -253
- package/skills/frontend/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/skills/frontend/ui-ux-pro-max/scripts/search.py +114 -114
- package/skills/frontend/vue-expert/SKILL.md +98 -98
- package/skills/frontend/vue-expert/references/build-tooling.md +480 -480
- package/skills/frontend/vue-expert/references/components.md +448 -448
- package/skills/frontend/vue-expert/references/composition-api.md +299 -299
- package/skills/frontend/vue-expert/references/mobile-hybrid.md +636 -636
- package/skills/frontend/vue-expert/references/nuxt.md +669 -669
- package/skills/frontend/vue-expert/references/state-management.md +449 -449
- package/skills/frontend/vue-expert/references/typescript.md +584 -584
- package/skills/frontend/vue-expert-js/SKILL.md +167 -167
- package/skills/frontend/vue-expert-js/references/component-architecture.md +219 -219
- package/skills/frontend/vue-expert-js/references/composables-patterns.md +183 -183
- package/skills/frontend/vue-expert-js/references/jsdoc-typing.md +535 -535
- package/skills/frontend/vue-expert-js/references/state-management.md +249 -249
- package/skills/frontend/vue-expert-js/references/testing-patterns.md +237 -237
- package/skills/go-rust-cpp/cpp-pro/SKILL.md +115 -115
- package/skills/go-rust-cpp/cpp-pro/references/build-tooling.md +440 -440
- package/skills/go-rust-cpp/cpp-pro/references/concurrency.md +437 -437
- package/skills/go-rust-cpp/cpp-pro/references/memory-performance.md +397 -397
- package/skills/go-rust-cpp/cpp-pro/references/modern-cpp.md +304 -304
- package/skills/go-rust-cpp/cpp-pro/references/templates.md +357 -357
- package/skills/go-rust-cpp/golang-pro/SKILL.md +122 -122
- package/skills/go-rust-cpp/golang-pro/references/concurrency.md +329 -329
- package/skills/go-rust-cpp/golang-pro/references/generics.md +442 -442
- package/skills/go-rust-cpp/golang-pro/references/interfaces.md +432 -432
- package/skills/go-rust-cpp/golang-pro/references/project-structure.md +477 -477
- package/skills/go-rust-cpp/golang-pro/references/testing.md +451 -451
- package/skills/go-rust-cpp/rust-engineer/SKILL.md +167 -167
- package/skills/go-rust-cpp/rust-engineer/references/async.md +458 -458
- package/skills/go-rust-cpp/rust-engineer/references/error-handling.md +334 -334
- package/skills/go-rust-cpp/rust-engineer/references/ownership.md +278 -278
- package/skills/go-rust-cpp/rust-engineer/references/testing.md +470 -470
- package/skills/go-rust-cpp/rust-engineer/references/traits.md +413 -413
- package/skills/infra/cli-developer/SKILL.md +113 -113
- package/skills/infra/cli-developer/references/design-patterns.md +221 -221
- package/skills/infra/cli-developer/references/go-cli.md +540 -540
- package/skills/infra/cli-developer/references/node-cli.md +383 -383
- package/skills/infra/cli-developer/references/python-cli.md +422 -422
- package/skills/infra/cli-developer/references/ux-patterns.md +448 -448
- package/skills/infra/cloud-architect/SKILL.md +216 -216
- package/skills/infra/cloud-architect/references/aws.md +394 -394
- package/skills/infra/cloud-architect/references/azure.md +562 -562
- package/skills/infra/cloud-architect/references/cost.md +582 -582
- package/skills/infra/cloud-architect/references/gcp.md +633 -633
- package/skills/infra/cloud-architect/references/multi-cloud.md +483 -483
- package/skills/infra/devops-engineer/SKILL.md +144 -144
- package/skills/infra/devops-engineer/references/deployment-strategies.md +241 -241
- package/skills/infra/devops-engineer/references/docker-patterns.md +113 -113
- package/skills/infra/devops-engineer/references/github-actions.md +139 -139
- package/skills/infra/devops-engineer/references/incident-response.md +331 -331
- package/skills/infra/devops-engineer/references/kubernetes.md +154 -154
- package/skills/infra/devops-engineer/references/platform-engineering.md +417 -417
- package/skills/infra/devops-engineer/references/release-automation.md +527 -527
- package/skills/infra/devops-engineer/references/terraform-iac.md +141 -141
- package/skills/infra/kubernetes-specialist/SKILL.md +241 -241
- package/skills/infra/kubernetes-specialist/references/configuration.md +452 -452
- package/skills/infra/kubernetes-specialist/references/cost-optimization.md +458 -458
- package/skills/infra/kubernetes-specialist/references/custom-operators.md +563 -563
- package/skills/infra/kubernetes-specialist/references/gitops.md +530 -530
- package/skills/infra/kubernetes-specialist/references/helm-charts.md +912 -912
- package/skills/infra/kubernetes-specialist/references/multi-cluster.md +507 -507
- package/skills/infra/kubernetes-specialist/references/networking.md +447 -447
- package/skills/infra/kubernetes-specialist/references/service-mesh.md +459 -459
- package/skills/infra/kubernetes-specialist/references/storage.md +535 -535
- package/skills/infra/kubernetes-specialist/references/troubleshooting.md +414 -414
- package/skills/infra/kubernetes-specialist/references/workloads.md +377 -377
- package/skills/infra/mcp-developer/SKILL.md +143 -143
- package/skills/infra/mcp-developer/references/protocol.md +244 -244
- package/skills/infra/mcp-developer/references/python-sdk.md +367 -367
- package/skills/infra/mcp-developer/references/resources.md +554 -554
- package/skills/infra/mcp-developer/references/tools.md +480 -480
- package/skills/infra/mcp-developer/references/typescript-sdk.md +350 -350
- package/skills/infra/monitoring-expert/SKILL.md +176 -176
- package/skills/infra/monitoring-expert/references/alerting-rules.md +141 -141
- package/skills/infra/monitoring-expert/references/application-profiling.md +331 -331
- package/skills/infra/monitoring-expert/references/capacity-planning.md +344 -344
- package/skills/infra/monitoring-expert/references/dashboards.md +126 -126
- package/skills/infra/monitoring-expert/references/opentelemetry.md +123 -123
- package/skills/infra/monitoring-expert/references/performance-testing.md +269 -269
- package/skills/infra/monitoring-expert/references/prometheus-metrics.md +136 -136
- package/skills/infra/monitoring-expert/references/structured-logging.md +142 -142
- package/skills/infra/sre-engineer/SKILL.md +181 -181
- package/skills/infra/sre-engineer/references/automation-toil.md +492 -492
- package/skills/infra/sre-engineer/references/error-budget-policy.md +334 -334
- package/skills/infra/sre-engineer/references/incident-chaos.md +576 -576
- package/skills/infra/sre-engineer/references/monitoring-alerting.md +424 -424
- package/skills/infra/sre-engineer/references/slo-sli-management.md +238 -238
- package/skills/infra/terraform-engineer/SKILL.md +143 -143
- package/skills/infra/terraform-engineer/references/best-practices.md +583 -583
- package/skills/infra/terraform-engineer/references/module-patterns.md +297 -297
- package/skills/infra/terraform-engineer/references/providers.md +452 -452
- package/skills/infra/terraform-engineer/references/state-management.md +371 -371
- package/skills/infra/terraform-engineer/references/testing.md +486 -486
- package/skills/infra/websocket-engineer/SKILL.md +168 -168
- package/skills/infra/websocket-engineer/references/alternatives.md +391 -391
- package/skills/infra/websocket-engineer/references/patterns.md +400 -400
- package/skills/infra/websocket-engineer/references/protocol.md +195 -195
- package/skills/infra/websocket-engineer/references/scaling.md +333 -333
- package/skills/infra/websocket-engineer/references/security.md +474 -474
- package/skills/java/java-architect/SKILL.md +132 -132
- package/skills/java/java-architect/references/jpa-optimization.md +393 -393
- package/skills/java/java-architect/references/reactive-webflux.md +356 -356
- package/skills/java/java-architect/references/spring-boot-setup.md +269 -269
- package/skills/java/java-architect/references/spring-security.md +445 -445
- package/skills/java/java-architect/references/testing-patterns.md +500 -500
- package/skills/java/kotlin-specialist/SKILL.md +147 -147
- package/skills/java/kotlin-specialist/references/android-compose.md +419 -419
- package/skills/java/kotlin-specialist/references/coroutines-flow.md +276 -276
- package/skills/java/kotlin-specialist/references/dsl-idioms.md +421 -421
- package/skills/java/kotlin-specialist/references/ktor-server.md +426 -426
- package/skills/java/kotlin-specialist/references/multiplatform-kmp.md +380 -380
- package/skills/java/spring-boot-engineer/SKILL.md +195 -195
- package/skills/java/spring-boot-engineer/references/cloud.md +498 -498
- package/skills/java/spring-boot-engineer/references/data.md +381 -381
- package/skills/java/spring-boot-engineer/references/security.md +459 -459
- package/skills/java/spring-boot-engineer/references/testing.md +545 -545
- package/skills/java/spring-boot-engineer/references/web.md +295 -295
- package/skills/javascript/javascript-pro/SKILL.md +132 -132
- package/skills/javascript/javascript-pro/references/async-patterns.md +334 -334
- package/skills/javascript/javascript-pro/references/browser-apis.md +398 -398
- package/skills/javascript/javascript-pro/references/modern-syntax.md +272 -272
- package/skills/javascript/javascript-pro/references/modules.md +357 -357
- package/skills/javascript/javascript-pro/references/node-essentials.md +471 -471
- package/skills/javascript/nestjs-expert/SKILL.md +206 -206
- package/skills/javascript/nestjs-expert/references/authentication.md +166 -166
- package/skills/javascript/nestjs-expert/references/controllers-routing.md +111 -111
- package/skills/javascript/nestjs-expert/references/dtos-validation.md +153 -153
- package/skills/javascript/nestjs-expert/references/migration-from-express.md +1237 -1237
- package/skills/javascript/nestjs-expert/references/services-di.md +140 -140
- package/skills/javascript/nestjs-expert/references/testing-patterns.md +186 -186
- package/skills/javascript/typescript-pro/SKILL.md +145 -145
- package/skills/javascript/typescript-pro/references/advanced-types.md +259 -259
- package/skills/javascript/typescript-pro/references/configuration.md +445 -445
- package/skills/javascript/typescript-pro/references/patterns.md +484 -484
- package/skills/javascript/typescript-pro/references/type-guards.md +352 -352
- package/skills/javascript/typescript-pro/references/utility-types.md +329 -329
- package/skills/php/laravel-specialist/SKILL.md +262 -262
- package/skills/php/laravel-specialist/references/eloquent.md +351 -351
- package/skills/php/laravel-specialist/references/livewire.md +512 -512
- package/skills/php/laravel-specialist/references/queues.md +423 -423
- package/skills/php/laravel-specialist/references/routing.md +362 -362
- package/skills/php/laravel-specialist/references/testing.md +522 -522
- package/skills/php/php-pro/SKILL.md +206 -206
- package/skills/php/php-pro/references/async-patterns.md +412 -412
- package/skills/php/php-pro/references/laravel-patterns.md +377 -377
- package/skills/php/php-pro/references/modern-php-features.md +323 -323
- package/skills/php/php-pro/references/symfony-patterns.md +466 -466
- package/skills/php/php-pro/references/testing-quality.md +466 -466
- package/skills/product/competitive-analysis/SKILL.md +257 -257
- package/skills/product/meeting-notes/SKILL.md +266 -266
- package/skills/product/prd-template/SKILL.md +150 -150
- package/skills/product/stakeholder-update/SKILL.md +225 -225
- package/skills/product/user-research-synthesis/SKILL.md +235 -235
- package/skills/python/django-expert/SKILL.md +162 -162
- package/skills/python/django-expert/references/authentication.md +145 -145
- package/skills/python/django-expert/references/drf-serializers.md +148 -148
- package/skills/python/django-expert/references/models-orm.md +151 -151
- package/skills/python/django-expert/references/testing-django.md +204 -204
- package/skills/python/django-expert/references/viewsets-views.md +153 -153
- package/skills/python/fastapi-expert/SKILL.md +185 -185
- package/skills/python/fastapi-expert/references/async-sqlalchemy.md +146 -146
- package/skills/python/fastapi-expert/references/authentication.md +159 -159
- package/skills/python/fastapi-expert/references/endpoints-routing.md +142 -142
- package/skills/python/fastapi-expert/references/migration-from-django.md +996 -996
- package/skills/python/fastapi-expert/references/pydantic-v2.md +135 -135
- package/skills/python/fastapi-expert/references/testing-async.md +159 -159
- package/skills/python/pandas-pro/SKILL.md +178 -178
- package/skills/python/pandas-pro/references/aggregation-groupby.md +545 -545
- package/skills/python/pandas-pro/references/data-cleaning.md +500 -500
- package/skills/python/pandas-pro/references/dataframe-operations.md +420 -420
- package/skills/python/pandas-pro/references/merging-joining.md +596 -596
- package/skills/python/pandas-pro/references/performance-optimization.md +597 -597
- package/skills/python/python-pro/SKILL.md +177 -177
- package/skills/python/python-pro/references/async-patterns.md +356 -356
- package/skills/python/python-pro/references/packaging.md +460 -460
- package/skills/python/python-pro/references/standard-library.md +378 -378
- package/skills/python/python-pro/references/testing.md +404 -404
- package/skills/python/python-pro/references/type-system.md +290 -290
- package/skills/quality/chaos-engineer/SKILL.md +182 -182
- package/skills/quality/chaos-engineer/references/chaos-tools.md +511 -511
- package/skills/quality/chaos-engineer/references/experiment-design.md +229 -229
- package/skills/quality/chaos-engineer/references/game-days.md +434 -434
- package/skills/quality/chaos-engineer/references/infrastructure-chaos.md +348 -348
- package/skills/quality/chaos-engineer/references/kubernetes-chaos.md +432 -432
- package/skills/quality/code-reviewer/SKILL.md +119 -119
- package/skills/quality/code-reviewer/references/common-issues.md +142 -142
- package/skills/quality/code-reviewer/references/feedback-examples.md +144 -144
- package/skills/quality/code-reviewer/references/receiving-feedback.md +238 -238
- package/skills/quality/code-reviewer/references/report-template.md +109 -109
- package/skills/quality/code-reviewer/references/review-checklist.md +88 -88
- package/skills/quality/code-reviewer/references/spec-compliance-review.md +258 -258
- package/skills/quality/playwright-expert/SKILL.md +169 -169
- package/skills/quality/playwright-expert/references/api-mocking.md +140 -140
- package/skills/quality/playwright-expert/references/configuration.md +155 -155
- package/skills/quality/playwright-expert/references/debugging-flaky.md +150 -150
- package/skills/quality/playwright-expert/references/page-object-model.md +152 -152
- package/skills/quality/playwright-expert/references/selectors-locators.md +119 -119
- package/skills/quality/secure-code-guardian/SKILL.md +191 -191
- package/skills/quality/secure-code-guardian/references/authentication.md +136 -136
- package/skills/quality/secure-code-guardian/references/input-validation.md +146 -146
- package/skills/quality/secure-code-guardian/references/owasp-prevention.md +135 -135
- package/skills/quality/secure-code-guardian/references/security-headers.md +133 -133
- package/skills/quality/secure-code-guardian/references/xss-csrf.md +157 -157
- package/skills/quality/security-reviewer/SKILL.md +103 -103
- package/skills/quality/security-reviewer/references/infrastructure-security.md +268 -268
- package/skills/quality/security-reviewer/references/penetration-testing.md +268 -268
- package/skills/quality/security-reviewer/references/report-template.md +170 -170
- package/skills/quality/security-reviewer/references/sast-tools.md +117 -117
- package/skills/quality/security-reviewer/references/secret-scanning.md +125 -125
- package/skills/quality/security-reviewer/references/vulnerability-patterns.md +152 -152
- package/skills/quality/senior-qa/README.md +196 -196
- package/skills/quality/senior-qa/SKILL.md +399 -399
- package/skills/quality/senior-qa/references/qa_best_practices.md +964 -964
- package/skills/quality/senior-qa/references/test_automation_patterns.md +1009 -1009
- package/skills/quality/senior-qa/references/testing_strategies.md +649 -649
- package/skills/quality/senior-qa/scripts/coverage_analyzer.py +836 -836
- package/skills/quality/senior-qa/scripts/e2e_test_scaffolder.py +820 -820
- package/skills/quality/senior-qa/scripts/test_suite_generator.py +605 -605
- package/skills/quality/tdd-guide/HOW_TO_USE.md +313 -313
- package/skills/quality/tdd-guide/README.md +680 -680
- package/skills/quality/tdd-guide/SKILL.md +122 -122
- package/skills/quality/tdd-guide/assets/expected_output.json +77 -77
- package/skills/quality/tdd-guide/assets/sample_input_python.json +39 -39
- package/skills/quality/tdd-guide/assets/sample_input_typescript.json +36 -36
- package/skills/quality/tdd-guide/references/ci-integration.md +195 -195
- package/skills/quality/tdd-guide/references/framework-guide.md +206 -206
- package/skills/quality/tdd-guide/references/tdd-best-practices.md +128 -128
- package/skills/quality/tdd-guide/scripts/coverage_analyzer.py +434 -434
- package/skills/quality/tdd-guide/scripts/fixture_generator.py +440 -440
- package/skills/quality/tdd-guide/scripts/format_detector.py +384 -384
- package/skills/quality/tdd-guide/scripts/framework_adapter.py +428 -428
- package/skills/quality/tdd-guide/scripts/metrics_calculator.py +456 -456
- package/skills/quality/tdd-guide/scripts/output_formatter.py +354 -354
- package/skills/quality/tdd-guide/scripts/tdd_workflow.py +474 -474
- package/skills/quality/tdd-guide/scripts/test_generator.py +438 -438
- package/skills/quality/test-master/SKILL.md +94 -94
- package/skills/quality/test-master/references/automation-frameworks.md +294 -294
- package/skills/quality/test-master/references/e2e-testing.md +128 -128
- package/skills/quality/test-master/references/integration-testing.md +120 -120
- package/skills/quality/test-master/references/performance-testing.md +118 -118
- package/skills/quality/test-master/references/qa-methodology.md +247 -247
- package/skills/quality/test-master/references/security-testing.md +127 -127
- package/skills/quality/test-master/references/tdd-iron-laws.md +174 -174
- package/skills/quality/test-master/references/test-reports.md +104 -104
- package/skills/quality/test-master/references/testing-anti-patterns.md +231 -231
- package/skills/quality/test-master/references/unit-testing.md +113 -113
- package/skills/ruby/rails-expert/SKILL.md +154 -154
- package/skills/ruby/rails-expert/references/active-record.md +244 -244
- package/skills/ruby/rails-expert/references/api-development.md +401 -401
- package/skills/ruby/rails-expert/references/background-jobs.md +272 -272
- package/skills/ruby/rails-expert/references/hotwire-turbo.md +228 -228
- package/skills/ruby/rails-expert/references/rspec-testing.md +367 -367
- package/skills/swift/swift-expert/SKILL.md +163 -163
- package/skills/swift/swift-expert/references/async-concurrency.md +360 -360
- package/skills/swift/swift-expert/references/memory-performance.md +377 -377
- package/skills/swift/swift-expert/references/protocol-oriented.md +354 -354
- package/skills/swift/swift-expert/references/swiftui-patterns.md +291 -291
- package/skills/swift/swift-expert/references/testing-patterns.md +399 -399
- package/skills/workflow/brainstorming/SKILL.md +164 -164
- package/skills/workflow/brainstorming/scripts/frame-template.html +214 -214
- package/skills/workflow/brainstorming/scripts/helper.js +88 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +354 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +148 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +56 -56
- package/skills/workflow/brainstorming/spec-document-reviewer-prompt.md +49 -49
- package/skills/workflow/brainstorming/visual-companion.md +287 -287
- package/skills/workflow/documentation/SKILL.md +45 -45
- package/skills/workflow/entropy-management/SKILL.md +115 -115
- package/skills/workflow/executing-plans/SKILL.md +70 -70
- package/skills/workflow/finishing-a-development-branch/SKILL.md +200 -200
- package/skills/workflow/receiving-code-review/SKILL.md +213 -213
- package/skills/workflow/requesting-code-review/SKILL.md +105 -105
- package/skills/workflow/requesting-code-review/code-reviewer.md +146 -146
- package/skills/workflow/requirement-engineering/SKILL.md +111 -111
- package/skills/workflow/systematic-debugging/CREATION-LOG.md +119 -119
- package/skills/workflow/systematic-debugging/SKILL.md +296 -296
- package/skills/workflow/systematic-debugging/condition-based-waiting-example.ts +158 -158
- package/skills/workflow/systematic-debugging/condition-based-waiting.md +115 -115
- package/skills/workflow/systematic-debugging/defense-in-depth.md +122 -122
- package/skills/workflow/systematic-debugging/find-polluter.sh +63 -63
- package/skills/workflow/systematic-debugging/root-cause-tracing.md +169 -169
- package/skills/workflow/systematic-debugging/test-academic.md +14 -14
- package/skills/workflow/systematic-debugging/test-pressure-1.md +58 -58
- package/skills/workflow/systematic-debugging/test-pressure-2.md +68 -68
- package/skills/workflow/systematic-debugging/test-pressure-3.md +69 -69
- package/skills/workflow/using-git-worktrees/SKILL.md +218 -218
- package/skills/workflow/verification-before-completion/SKILL.md +139 -139
- package/skills/workflow/writing-plans/SKILL.md +151 -151
- package/skills/workflow/writing-plans/plan-document-reviewer-prompt.md +49 -49
- package/skills/workflow/writing-skills/SKILL.md +655 -655
- package/skills/workflow/writing-skills/anthropic-best-practices.md +1150 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -189
- package/skills/workflow/writing-skills/persuasion-principles.md +187 -187
- package/skills/workflow/writing-skills/render-graphs.js +168 -168
- package/skills/workflow/writing-skills/testing-skills-with-subagents.md +384 -384
|
@@ -1,354 +1,354 @@
|
|
|
1
|
-
# Protocol-Oriented Programming
|
|
2
|
-
|
|
3
|
-
## Protocol Basics
|
|
4
|
-
|
|
5
|
-
```swift
|
|
6
|
-
// Protocol with requirements
|
|
7
|
-
protocol Drawable {
|
|
8
|
-
var boundingBox: CGRect { get }
|
|
9
|
-
func draw(in context: CGContext)
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// Protocol with default implementation
|
|
13
|
-
extension Drawable {
|
|
14
|
-
func draw(in context: CGContext) {
|
|
15
|
-
// Default drawing behavior
|
|
16
|
-
context.stroke(boundingBox)
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Struct conforming to protocol
|
|
21
|
-
struct Circle: Drawable {
|
|
22
|
-
let center: CGPoint
|
|
23
|
-
let radius: CGFloat
|
|
24
|
-
|
|
25
|
-
var boundingBox: CGRect {
|
|
26
|
-
CGRect(
|
|
27
|
-
x: center.x - radius,
|
|
28
|
-
y: center.y - radius,
|
|
29
|
-
width: radius * 2,
|
|
30
|
-
height: radius * 2
|
|
31
|
-
)
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Associated Types
|
|
37
|
-
|
|
38
|
-
```swift
|
|
39
|
-
// Protocol with associated type
|
|
40
|
-
protocol Container {
|
|
41
|
-
associatedtype Item
|
|
42
|
-
var count: Int { get }
|
|
43
|
-
mutating func append(_ item: Item)
|
|
44
|
-
subscript(index: Int) -> Item { get }
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Generic struct conforming
|
|
48
|
-
struct Stack<Element>: Container {
|
|
49
|
-
typealias Item = Element // Can be inferred
|
|
50
|
-
private var items: [Element] = []
|
|
51
|
-
|
|
52
|
-
var count: Int { items.count }
|
|
53
|
-
|
|
54
|
-
mutating func append(_ item: Element) {
|
|
55
|
-
items.append(item)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
subscript(index: Int) -> Element {
|
|
59
|
-
items[index]
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Using where clause with associated types
|
|
64
|
-
extension Container where Item: Equatable {
|
|
65
|
-
func firstIndex(of item: Item) -> Int? {
|
|
66
|
-
for (index, current) in enumerated() where current == item {
|
|
67
|
-
return index
|
|
68
|
-
}
|
|
69
|
-
return nil
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## Protocol Composition
|
|
75
|
-
|
|
76
|
-
```swift
|
|
77
|
-
// Multiple protocol conformance
|
|
78
|
-
protocol Named {
|
|
79
|
-
var name: String { get }
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
protocol Aged {
|
|
83
|
-
var age: Int { get }
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Composing protocols
|
|
87
|
-
typealias Person = Named & Aged
|
|
88
|
-
|
|
89
|
-
func greet(_ person: some Named & Aged) {
|
|
90
|
-
print("Hello \(person.name), age \(person.age)")
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Protocol composition in constraints
|
|
94
|
-
func process<T: Codable & Hashable>(_ items: [T]) {
|
|
95
|
-
// T must conform to both Codable and Hashable
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## Generics with Protocols
|
|
100
|
-
|
|
101
|
-
```swift
|
|
102
|
-
// Generic function with protocol constraint
|
|
103
|
-
func compare<T: Comparable>(_ a: T, _ b: T) -> T {
|
|
104
|
-
return a > b ? a : b
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Generic type with protocol constraint
|
|
108
|
-
class Repository<Model: Codable & Identifiable> {
|
|
109
|
-
private var items: [Model.ID: Model] = [:]
|
|
110
|
-
|
|
111
|
-
func save(_ model: Model) {
|
|
112
|
-
items[model.id] = model
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
func find(id: Model.ID) -> Model? {
|
|
116
|
-
items[id]
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
func all() -> [Model] {
|
|
120
|
-
Array(items.values)
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Using opaque return types
|
|
125
|
-
func makeCollection() -> some Collection {
|
|
126
|
-
return [1, 2, 3, 4, 5]
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// Primary associated types (Swift 5.7+)
|
|
130
|
-
protocol DataSource<Element> {
|
|
131
|
-
associatedtype Element
|
|
132
|
-
func fetch() async throws -> [Element]
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
func loadData<T>(from source: some DataSource<T>) async throws -> [T] {
|
|
136
|
-
try await source.fetch()
|
|
137
|
-
}
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
## Type Erasure
|
|
141
|
-
|
|
142
|
-
```swift
|
|
143
|
-
// Problem: Can't use protocol with associated types as type
|
|
144
|
-
// protocol Storage {
|
|
145
|
-
// associatedtype Item
|
|
146
|
-
// func store(_ item: Item)
|
|
147
|
-
// }
|
|
148
|
-
// var storage: Storage // Error: protocol can only be used as constraint
|
|
149
|
-
|
|
150
|
-
// Solution: Type-erased wrapper
|
|
151
|
-
protocol Storage {
|
|
152
|
-
associatedtype Item
|
|
153
|
-
func store(_ item: Item)
|
|
154
|
-
func retrieve() -> Item?
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
struct AnyStorage<T>: Storage {
|
|
158
|
-
typealias Item = T
|
|
159
|
-
|
|
160
|
-
private let _store: (T) -> Void
|
|
161
|
-
private let _retrieve: () -> T?
|
|
162
|
-
|
|
163
|
-
init<S: Storage>(_ storage: S) where S.Item == T {
|
|
164
|
-
_store = storage.store
|
|
165
|
-
_retrieve = storage.retrieve
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
func store(_ item: T) {
|
|
169
|
-
_store(item)
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
func retrieve() -> T? {
|
|
173
|
-
_retrieve()
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// Now we can use it as a type
|
|
178
|
-
class MemoryStorage<T>: Storage {
|
|
179
|
-
private var item: T?
|
|
180
|
-
|
|
181
|
-
func store(_ item: T) {
|
|
182
|
-
self.item = item
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
func retrieve() -> T? {
|
|
186
|
-
item
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
let storage: AnyStorage<String> = AnyStorage(MemoryStorage<String>())
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
## Protocol Inheritance
|
|
194
|
-
|
|
195
|
-
```swift
|
|
196
|
-
// Protocol inheriting from another
|
|
197
|
-
protocol Identifiable {
|
|
198
|
-
var id: UUID { get }
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
protocol Timestampable {
|
|
202
|
-
var createdAt: Date { get }
|
|
203
|
-
var updatedAt: Date { get }
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
protocol Entity: Identifiable, Timestampable {
|
|
207
|
-
var version: Int { get }
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
struct User: Entity {
|
|
211
|
-
let id: UUID
|
|
212
|
-
let createdAt: Date
|
|
213
|
-
var updatedAt: Date
|
|
214
|
-
var version: Int
|
|
215
|
-
var name: String
|
|
216
|
-
}
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
## Conditional Conformance
|
|
220
|
-
|
|
221
|
-
```swift
|
|
222
|
-
// Make Array conform to protocol when elements conform
|
|
223
|
-
protocol Summarizable {
|
|
224
|
-
var summary: String { get }
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
extension Array: Summarizable where Element: Summarizable {
|
|
228
|
-
var summary: String {
|
|
229
|
-
map { $0.summary }.joined(separator: ", ")
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
struct Task: Summarizable {
|
|
234
|
-
let title: String
|
|
235
|
-
var summary: String { title }
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
let tasks = [Task(title: "Buy milk"), Task(title: "Walk dog")]
|
|
239
|
-
print(tasks.summary) // "Buy milk, Walk dog"
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
## Protocol Extensions
|
|
243
|
-
|
|
244
|
-
```swift
|
|
245
|
-
// Adding functionality to all conforming types
|
|
246
|
-
protocol Collection {
|
|
247
|
-
associatedtype Element
|
|
248
|
-
var count: Int { get }
|
|
249
|
-
subscript(index: Int) -> Element { get }
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
extension Collection {
|
|
253
|
-
var isEmpty: Bool {
|
|
254
|
-
count == 0
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
func map<T>(_ transform: (Element) -> T) -> [T] {
|
|
258
|
-
var result: [T] = []
|
|
259
|
-
for i in 0..<count {
|
|
260
|
-
result.append(transform(self[i]))
|
|
261
|
-
}
|
|
262
|
-
return result
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// Constrained extensions
|
|
267
|
-
extension Collection where Element: Numeric {
|
|
268
|
-
func sum() -> Element {
|
|
269
|
-
var total: Element = 0
|
|
270
|
-
for i in 0..<count {
|
|
271
|
-
total += self[i]
|
|
272
|
-
}
|
|
273
|
-
return total
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
## Advanced Patterns
|
|
279
|
-
|
|
280
|
-
```swift
|
|
281
|
-
// Phantom types for type safety
|
|
282
|
-
enum Celsius {}
|
|
283
|
-
enum Fahrenheit {}
|
|
284
|
-
|
|
285
|
-
struct Temperature<Unit> {
|
|
286
|
-
let value: Double
|
|
287
|
-
|
|
288
|
-
init(_ value: Double) {
|
|
289
|
-
self.value = value
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
extension Temperature where Unit == Celsius {
|
|
294
|
-
func toFahrenheit() -> Temperature<Fahrenheit> {
|
|
295
|
-
Temperature<Fahrenheit>(value * 9/5 + 32)
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
extension Temperature where Unit == Fahrenheit {
|
|
300
|
-
func toCelsius() -> Temperature<Celsius> {
|
|
301
|
-
Temperature<Celsius>((value - 32) * 5/9)
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
let celsius = Temperature<Celsius>(100)
|
|
306
|
-
let fahrenheit = celsius.toFahrenheit()
|
|
307
|
-
|
|
308
|
-
// Witness tables pattern
|
|
309
|
-
protocol Encoder {
|
|
310
|
-
func encode<T: Encodable>(_ value: T) throws -> Data
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
protocol Decoder {
|
|
314
|
-
func decode<T: Decodable>(_ type: T.Type, from data: Data) throws -> T
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
struct Codec<E: Encoder, D: Decoder> {
|
|
318
|
-
let encoder: E
|
|
319
|
-
let decoder: D
|
|
320
|
-
|
|
321
|
-
func roundtrip<T: Codable>(_ value: T) throws -> T {
|
|
322
|
-
let data = try encoder.encode(value)
|
|
323
|
-
return try decoder.decode(T.self, from: data)
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
## Retroactive Modeling
|
|
329
|
-
|
|
330
|
-
```swift
|
|
331
|
-
// Adding protocol conformance to types you don't own
|
|
332
|
-
extension Int: Identifiable {
|
|
333
|
-
public var id: Int { self }
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
// Now Int can be used where Identifiable is required
|
|
337
|
-
let numbers: [Int] = [1, 2, 3]
|
|
338
|
-
ForEach(numbers) { number in
|
|
339
|
-
Text("\(number)")
|
|
340
|
-
}
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
## Best Practices
|
|
344
|
-
|
|
345
|
-
- Prefer protocols over base classes for abstraction
|
|
346
|
-
- Use protocol extensions for default implementations
|
|
347
|
-
- Design protocols with single responsibility
|
|
348
|
-
- Use associated types for generic protocols
|
|
349
|
-
- Apply type erasure when needed for storage
|
|
350
|
-
- Leverage conditional conformance
|
|
351
|
-
- Use opaque return types (some Protocol) for implementation hiding
|
|
352
|
-
- Compose small protocols rather than large ones
|
|
353
|
-
- Document protocol requirements and guarantees
|
|
354
|
-
- Consider protocol inheritance for layered abstraction
|
|
1
|
+
# Protocol-Oriented Programming
|
|
2
|
+
|
|
3
|
+
## Protocol Basics
|
|
4
|
+
|
|
5
|
+
```swift
|
|
6
|
+
// Protocol with requirements
|
|
7
|
+
protocol Drawable {
|
|
8
|
+
var boundingBox: CGRect { get }
|
|
9
|
+
func draw(in context: CGContext)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// Protocol with default implementation
|
|
13
|
+
extension Drawable {
|
|
14
|
+
func draw(in context: CGContext) {
|
|
15
|
+
// Default drawing behavior
|
|
16
|
+
context.stroke(boundingBox)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Struct conforming to protocol
|
|
21
|
+
struct Circle: Drawable {
|
|
22
|
+
let center: CGPoint
|
|
23
|
+
let radius: CGFloat
|
|
24
|
+
|
|
25
|
+
var boundingBox: CGRect {
|
|
26
|
+
CGRect(
|
|
27
|
+
x: center.x - radius,
|
|
28
|
+
y: center.y - radius,
|
|
29
|
+
width: radius * 2,
|
|
30
|
+
height: radius * 2
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Associated Types
|
|
37
|
+
|
|
38
|
+
```swift
|
|
39
|
+
// Protocol with associated type
|
|
40
|
+
protocol Container {
|
|
41
|
+
associatedtype Item
|
|
42
|
+
var count: Int { get }
|
|
43
|
+
mutating func append(_ item: Item)
|
|
44
|
+
subscript(index: Int) -> Item { get }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Generic struct conforming
|
|
48
|
+
struct Stack<Element>: Container {
|
|
49
|
+
typealias Item = Element // Can be inferred
|
|
50
|
+
private var items: [Element] = []
|
|
51
|
+
|
|
52
|
+
var count: Int { items.count }
|
|
53
|
+
|
|
54
|
+
mutating func append(_ item: Element) {
|
|
55
|
+
items.append(item)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
subscript(index: Int) -> Element {
|
|
59
|
+
items[index]
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Using where clause with associated types
|
|
64
|
+
extension Container where Item: Equatable {
|
|
65
|
+
func firstIndex(of item: Item) -> Int? {
|
|
66
|
+
for (index, current) in enumerated() where current == item {
|
|
67
|
+
return index
|
|
68
|
+
}
|
|
69
|
+
return nil
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Protocol Composition
|
|
75
|
+
|
|
76
|
+
```swift
|
|
77
|
+
// Multiple protocol conformance
|
|
78
|
+
protocol Named {
|
|
79
|
+
var name: String { get }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
protocol Aged {
|
|
83
|
+
var age: Int { get }
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Composing protocols
|
|
87
|
+
typealias Person = Named & Aged
|
|
88
|
+
|
|
89
|
+
func greet(_ person: some Named & Aged) {
|
|
90
|
+
print("Hello \(person.name), age \(person.age)")
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Protocol composition in constraints
|
|
94
|
+
func process<T: Codable & Hashable>(_ items: [T]) {
|
|
95
|
+
// T must conform to both Codable and Hashable
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Generics with Protocols
|
|
100
|
+
|
|
101
|
+
```swift
|
|
102
|
+
// Generic function with protocol constraint
|
|
103
|
+
func compare<T: Comparable>(_ a: T, _ b: T) -> T {
|
|
104
|
+
return a > b ? a : b
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Generic type with protocol constraint
|
|
108
|
+
class Repository<Model: Codable & Identifiable> {
|
|
109
|
+
private var items: [Model.ID: Model] = [:]
|
|
110
|
+
|
|
111
|
+
func save(_ model: Model) {
|
|
112
|
+
items[model.id] = model
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
func find(id: Model.ID) -> Model? {
|
|
116
|
+
items[id]
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
func all() -> [Model] {
|
|
120
|
+
Array(items.values)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Using opaque return types
|
|
125
|
+
func makeCollection() -> some Collection {
|
|
126
|
+
return [1, 2, 3, 4, 5]
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Primary associated types (Swift 5.7+)
|
|
130
|
+
protocol DataSource<Element> {
|
|
131
|
+
associatedtype Element
|
|
132
|
+
func fetch() async throws -> [Element]
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
func loadData<T>(from source: some DataSource<T>) async throws -> [T] {
|
|
136
|
+
try await source.fetch()
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Type Erasure
|
|
141
|
+
|
|
142
|
+
```swift
|
|
143
|
+
// Problem: Can't use protocol with associated types as type
|
|
144
|
+
// protocol Storage {
|
|
145
|
+
// associatedtype Item
|
|
146
|
+
// func store(_ item: Item)
|
|
147
|
+
// }
|
|
148
|
+
// var storage: Storage // Error: protocol can only be used as constraint
|
|
149
|
+
|
|
150
|
+
// Solution: Type-erased wrapper
|
|
151
|
+
protocol Storage {
|
|
152
|
+
associatedtype Item
|
|
153
|
+
func store(_ item: Item)
|
|
154
|
+
func retrieve() -> Item?
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
struct AnyStorage<T>: Storage {
|
|
158
|
+
typealias Item = T
|
|
159
|
+
|
|
160
|
+
private let _store: (T) -> Void
|
|
161
|
+
private let _retrieve: () -> T?
|
|
162
|
+
|
|
163
|
+
init<S: Storage>(_ storage: S) where S.Item == T {
|
|
164
|
+
_store = storage.store
|
|
165
|
+
_retrieve = storage.retrieve
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
func store(_ item: T) {
|
|
169
|
+
_store(item)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
func retrieve() -> T? {
|
|
173
|
+
_retrieve()
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Now we can use it as a type
|
|
178
|
+
class MemoryStorage<T>: Storage {
|
|
179
|
+
private var item: T?
|
|
180
|
+
|
|
181
|
+
func store(_ item: T) {
|
|
182
|
+
self.item = item
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
func retrieve() -> T? {
|
|
186
|
+
item
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
let storage: AnyStorage<String> = AnyStorage(MemoryStorage<String>())
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Protocol Inheritance
|
|
194
|
+
|
|
195
|
+
```swift
|
|
196
|
+
// Protocol inheriting from another
|
|
197
|
+
protocol Identifiable {
|
|
198
|
+
var id: UUID { get }
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
protocol Timestampable {
|
|
202
|
+
var createdAt: Date { get }
|
|
203
|
+
var updatedAt: Date { get }
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
protocol Entity: Identifiable, Timestampable {
|
|
207
|
+
var version: Int { get }
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
struct User: Entity {
|
|
211
|
+
let id: UUID
|
|
212
|
+
let createdAt: Date
|
|
213
|
+
var updatedAt: Date
|
|
214
|
+
var version: Int
|
|
215
|
+
var name: String
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Conditional Conformance
|
|
220
|
+
|
|
221
|
+
```swift
|
|
222
|
+
// Make Array conform to protocol when elements conform
|
|
223
|
+
protocol Summarizable {
|
|
224
|
+
var summary: String { get }
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
extension Array: Summarizable where Element: Summarizable {
|
|
228
|
+
var summary: String {
|
|
229
|
+
map { $0.summary }.joined(separator: ", ")
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
struct Task: Summarizable {
|
|
234
|
+
let title: String
|
|
235
|
+
var summary: String { title }
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
let tasks = [Task(title: "Buy milk"), Task(title: "Walk dog")]
|
|
239
|
+
print(tasks.summary) // "Buy milk, Walk dog"
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Protocol Extensions
|
|
243
|
+
|
|
244
|
+
```swift
|
|
245
|
+
// Adding functionality to all conforming types
|
|
246
|
+
protocol Collection {
|
|
247
|
+
associatedtype Element
|
|
248
|
+
var count: Int { get }
|
|
249
|
+
subscript(index: Int) -> Element { get }
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
extension Collection {
|
|
253
|
+
var isEmpty: Bool {
|
|
254
|
+
count == 0
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
func map<T>(_ transform: (Element) -> T) -> [T] {
|
|
258
|
+
var result: [T] = []
|
|
259
|
+
for i in 0..<count {
|
|
260
|
+
result.append(transform(self[i]))
|
|
261
|
+
}
|
|
262
|
+
return result
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Constrained extensions
|
|
267
|
+
extension Collection where Element: Numeric {
|
|
268
|
+
func sum() -> Element {
|
|
269
|
+
var total: Element = 0
|
|
270
|
+
for i in 0..<count {
|
|
271
|
+
total += self[i]
|
|
272
|
+
}
|
|
273
|
+
return total
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## Advanced Patterns
|
|
279
|
+
|
|
280
|
+
```swift
|
|
281
|
+
// Phantom types for type safety
|
|
282
|
+
enum Celsius {}
|
|
283
|
+
enum Fahrenheit {}
|
|
284
|
+
|
|
285
|
+
struct Temperature<Unit> {
|
|
286
|
+
let value: Double
|
|
287
|
+
|
|
288
|
+
init(_ value: Double) {
|
|
289
|
+
self.value = value
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
extension Temperature where Unit == Celsius {
|
|
294
|
+
func toFahrenheit() -> Temperature<Fahrenheit> {
|
|
295
|
+
Temperature<Fahrenheit>(value * 9/5 + 32)
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
extension Temperature where Unit == Fahrenheit {
|
|
300
|
+
func toCelsius() -> Temperature<Celsius> {
|
|
301
|
+
Temperature<Celsius>((value - 32) * 5/9)
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
let celsius = Temperature<Celsius>(100)
|
|
306
|
+
let fahrenheit = celsius.toFahrenheit()
|
|
307
|
+
|
|
308
|
+
// Witness tables pattern
|
|
309
|
+
protocol Encoder {
|
|
310
|
+
func encode<T: Encodable>(_ value: T) throws -> Data
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
protocol Decoder {
|
|
314
|
+
func decode<T: Decodable>(_ type: T.Type, from data: Data) throws -> T
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
struct Codec<E: Encoder, D: Decoder> {
|
|
318
|
+
let encoder: E
|
|
319
|
+
let decoder: D
|
|
320
|
+
|
|
321
|
+
func roundtrip<T: Codable>(_ value: T) throws -> T {
|
|
322
|
+
let data = try encoder.encode(value)
|
|
323
|
+
return try decoder.decode(T.self, from: data)
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## Retroactive Modeling
|
|
329
|
+
|
|
330
|
+
```swift
|
|
331
|
+
// Adding protocol conformance to types you don't own
|
|
332
|
+
extension Int: Identifiable {
|
|
333
|
+
public var id: Int { self }
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// Now Int can be used where Identifiable is required
|
|
337
|
+
let numbers: [Int] = [1, 2, 3]
|
|
338
|
+
ForEach(numbers) { number in
|
|
339
|
+
Text("\(number)")
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
## Best Practices
|
|
344
|
+
|
|
345
|
+
- Prefer protocols over base classes for abstraction
|
|
346
|
+
- Use protocol extensions for default implementations
|
|
347
|
+
- Design protocols with single responsibility
|
|
348
|
+
- Use associated types for generic protocols
|
|
349
|
+
- Apply type erasure when needed for storage
|
|
350
|
+
- Leverage conditional conformance
|
|
351
|
+
- Use opaque return types (some Protocol) for implementation hiding
|
|
352
|
+
- Compose small protocols rather than large ones
|
|
353
|
+
- Document protocol requirements and guarantees
|
|
354
|
+
- Consider protocol inheritance for layered abstraction
|