소스 정보
- 저장소
- tomevault-io/skills-registry
- 최근 소스 활동
- 2026년 5월 23일 22:30
- 감지된 SKILL.md 언어
- 영어
- 스타
- 0
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/tomevault-io/skills-registry --skill swift-ios-development명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
| Use when this capability is needed.
> Use when this capability is needed.
Review architecture and API design for the vfs-s3 project. Use when the user mentions @architect, asks to review an issue's design, discuss module boundaries, API shape, or architectural decisions for vfs-s3. Also trigger when the user wants to create an ADR (Architecture Decision Record) or evaluate a technical approach for the project. Intended for dispatch from Codex automation or Claude routines; GitHub trigger phrase: @vfs-s3-bot please prepare design doc Use when this capability is needed.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | swift-ios-development |
| description | >- Use when this capability is needed. |
// guard let — preferred for early returns
func greet(name: String?) {
guard let name = name else { return }
print("Hello, \(name)")
}
// Optional chaining + nil coalescing
let length = user?.profile?.bio?.count
let displayName = user.nickname ?? user.fullName ?? "Anonymous"
protocol Repository {
associatedtype Entity: Identifiable
func findById(_ id: Entity.ID) async throws -> Entity?
func save(_ entity: Entity) async throws
}
// Default implementations via extension
extension Repository {
func findByIdOrFail(_ id: Entity.ID) async throws -> Entity {
guard let entity = try await findById(id) else {
throw RepositoryError.notFound(id: "\(id)")
}
return entity
}
}
// Extend existing types
extension Date {
var isToday: Bool { Calendar.current.isDateInToday(self) }
}
extension Array where Element: Numeric {
var sum: Element { reduce(0, +) }
}
enum NetworkResult<T: Decodable> {
case success(T)
case failure(NetworkError)
case loading
}
enum Route: Hashable {
case home
case userDetail(userId: UUID)
case settings(tab: SettingsTab)
}
// Pattern matching
switch result {
case .success(let data):
updateUI(with: data)
case .failure(let error) where error.isRetryable:
scheduleRetry()
case .failure(let error):
showError(error)
case .loading:
showSpinner()
}
func fetch<T: Decodable>(from url: URL) async throws -> T {
let (data, response) = try await URLSession.shared.data(from: url)
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
throw NetworkError.invalidResponse
}
return try JSONDecoder().decode(T.self, from: data)
}
class UserDetailViewController: UIViewController {
private let userId: UUID
private let repository: UserRepository
// Dependency injection via initializer
init(userId: UUID, repository: UserRepository) {
self.userId = userId
self.repository = repository
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) { fatalError("Use init(userId:repository:)") }
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
Task {
do {
let user = try await repository.findByIdOrFail(userId)
updateUI(with: user)
} catch { showError(error) }
}
}
private func setupUI() {
view.backgroundColor = .systemBackground
let stack = UIStackView(arrangedSubviews: [nameLabel, emailLabel])
stack.axis = .vertical
stack.spacing
stack.translatesAutoresizingMaskIntoConstraints
view.addSubview(stack)
.activate([
stack.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: ),
stack.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: ),
stack.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: ),
])
}
}
import SwiftUI
// @State for local view state
struct CounterView: View {
@State private var count = 0
var body: some View {
Button("Count: \(count)") { count += 1 }
.buttonStyle(.borderedProminent)
}
}
// @Binding for child → parent communication
struct SettingsToggle: View {
@Binding var isEnabled: Bool
let title: String
var body: some View { Toggle(title, isOn: $isEnabled) }
}
// ObservableObject + @StateObject for shared state (pre-iOS 17)
class UserViewModel: ObservableObject {
@Published var user: User?
@Published var isLoading = false
@MainActor
func loadUser(id: UUID) async {
isLoading = true
{ isLoading }
user .shared.findById(id)
}
}
: {
vm ()
userId:
body: {
{
vm.isLoading { () }
user vm.user { (user.name) }
}
.task { vm.loadUser(id: userId) }
}
}
import Observation
@Observable
class AppState {
var currentUser: User?
var theme: Theme = .system
}
struct RootView: View {
@State private var appState = AppState()
var body: some View {
ContentView().environment(appState)
}
}
struct ContentView: View {
@Environment(AppState.self) private var appState
var body: some View {
// Tracks only properties actually read
Text(appState.currentUser?.name ?? "Guest")
}
}
// Parallel async with async let
func fetchDashboard() async throws -> Dashboard {
async let profile = fetchProfile()
async let notifications = fetchNotifications()
return Dashboard(
profile: try await profile,
notifications: try await notifications
)
}
// Actor for thread-safe mutable state
actor ImageCache {
private var cache: [URL: UIImage] = [:]
func image(for url: URL) async throws -> UIImage {
if let cached = cache[url] { return cached }
let (data, _) = try await URLSession.shared.data(from: url)
guard let image = UIImage(data: data) else {
throw ImageError.invalidData
}
cache[url] = image
image
}
}
import XCTest
@testable import MyApp
final class UserRepositoryTests: XCTestCase {
private var sut: UserRepository!
private var mockAPI: MockAPIClient!
override func setUp() {
super.setUp()
mockAPI = MockAPIClient()
sut = UserRepository(api: mockAPI)
}
override func tearDown() {
sut = nil
mockAPI = nil
super.tearDown()
}
func test_findById_returnsUser_whenAPISucceeds() async throws {
// Given
let expected = User(id: UUID(), name: "Ada", email: "ada@example.com")
mockAPI.stubbedResponse = expected
// When
let user = try await sut.findById(expected.id)
// Then
XCTAssertEqual(user?.name, "Ada")
}
() {
mockAPI.stubbedError .serverError()
{
sut.findById(())
()
} {
(error )
}
}
}
MyApp/
├── App/
│ └── MyApp.swift # @main entry point
├── Features/
│ ├── Auth/ (Views/, ViewModels/, Models/)
│ └── Dashboard/
├── Core/
│ ├── Network/ (APIClient.swift, Endpoints.swift)
│ ├── Storage/
│ └── Extensions/
├── Resources/ (Assets.xcassets, Localizable.strings)
└── Tests/ (UnitTests/, UITests/)
// Package.swift — swift-tools-version: 5.9
import PackageDescription
let package = Package(
name: "MyLibrary",
platforms: [.iOS(.v16), .macOS(.v13)],
products: [.library(name: "MyLibrary", targets: ["MyLibrary"])],
dependencies: [
.package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.8.0"),
],
targets: [
.target(name: "MyLibrary", dependencies: ["Alamofire"]),
.testTarget(name: "MyLibraryTests", dependencies: ["MyLibrary"]),
]
)
guard let for early returns — keeps the happy path unindented and readable.async/await over completion handlers — cleaner, safer, integrates with structured
concurrency.@MainActor for view models and UI code — prevents data races on the main thread.[weak self] in escaping closures to prevent retain cycles.Codable for JSON — built-in, type-safe serialization.@Observable (iOS 17+) over ObservableObject — simpler and more efficient.!) in production code — use guard let, if let, or ?? instead.var when let works — immutability by default prevents bugs.@Sendable warnings — they indicate potential data races.async/await or DispatchQueue for heavy work.NotificationCenter for everything — prefer delegates, closures, or Combine.setUp/tearDown in XCTest — fresh state per test prevents flaky tests.# Swift packages
swift package init --type library
swift build
swift test
# Xcode
xcodebuild -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 15' build
xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 15'
Source: dallay/agents-skills — distributed by TomeVault.