xiaohongshu
xiaohongshu
ios-swift-development
Develop native iOS apps with Swift. Covers MVVM architecture, SwiftUI, URLSession for networking, Combine for reactive programming, and Core Data persistence.
Full skill instructions
Build high-performance native iOS applications using Swift with modern frameworks including SwiftUI, Combine, and async/await patterns.
import Foundation
import Combine
struct User: Codable, Identifiable {
let id: UUID
var name: String
var email: String
}
class UserViewModel: ObservableObject {
@Published var user: User?
@Published var isLoading = false
@Published var errorMessage: String?
private let networkService: NetworkService
init(networkService: NetworkService = .shared) {
self.networkService = networkService
}
@MainActor
func fetchUser(id: UUID) async {
isLoading = true
errorMessage = nil
do {
user = try await networkService.fetch(User.self, from: "/users/\(id)")
} catch {
errorMessage = error.localizedDescription
}
isLoading = false
}
@MainActor
func updateUser(_ userData: User) async {
guard let user = user else { return }
do {
self.user = try await networkService.put(
User.self,
to: "/users/\(user.id)",
body: userData
)
} catch {
errorMessage = "Failed to update user"
}
}
func logout() {
user = nil
errorMessage = nil
}
}
class NetworkService {
static let shared = NetworkService()
private let session: URLSession
private let baseURL: URL
init(
session: URLSession = .shared,
baseURL: URL = URL(string: "https://api.example.com")!
) {
self.session = session
self.baseURL = baseURL
}
func fetch<T: Decodable>(
_: T.Type,
from endpoint: String
) async throws -> T {
let url = baseURL.appendingPathComponent(endpoint)
var request = URLRequest(url: url)
request.addAuthHeader()
let (data, response) = try await session.data(for: request)
try validateResponse(response)
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
return try decoder.decode(T.self, from: data)
}
func put<T: Decodable, Body: Encodable>(
_: T.Type,
to endpoint: String,
body: Body
) async throws -> T {
let url = baseURL.appendingPathComponent(endpoint)
var request = URLRequest(url: url)
request.httpMethod = "PUT"
request.addAuthHeader()
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
request.httpBody = try encoder.encode(body)
let (data, response) = try await session.data(for: request)
try validateResponse(response)
let decoder = JSONDecoder()
return try decoder.decode(T.self, from: data)
}
private func validateResponse(_ response: URLResponse) throws {
guard let httpResponse = response as? HTTPURLResponse else {
throw NetworkError.invalidResponse
}
switch httpResponse.statusCode {
case 200...299:
return
case 401:
throw NetworkError.unauthorized
case 500...599:
throw NetworkError.serverError
default:
throw NetworkError.unknown
}
}
}
enum NetworkError: LocalizedError {
case invalidResponse
case unauthorized
case serverError
case unknown
var errorDescription: String? {
switch self {
case .invalidResponse: return "Invalid response"
case .unauthorized: return "Unauthorized"
case .serverError: return "Server error"
case .unknown: return "Unknown error"
}
}
}
extension URLRequest {
mutating func addAuthHeader() {
if let token = KeychainManager.shared.getToken() {
setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
}
}
}
struct ContentView: View {
@StateObject var userViewModel = UserViewModel()
var body: some View {
TabView {
HomeView()
.tabItem { Label("Home", systemImage: "house") }
ProfileView(viewModel: userViewModel)
.tabItem { Label("Profile", systemImage: "person") }
}
}
}
struct HomeView: View {
@State var items: [Item] = []
@State var loading = true
var body: some View {
NavigationView {
ZStack {
if loading {
ProgressView()
} else {
List(items) { item in
NavigationLink(destination: ItemDetailView(item: item)) {
VStack(alignment: .leading) {
Text(item.title).font(.headline)
Text(item.description).font(.subheadline).foregroundColor(.gray)
}
}
}
}
}
.navigationTitle("Items")
.task {
await loadItems()
}
}
}
private func loadItems() async {
do {
items = try await NetworkService.shared.fetch([Item].self, from: "/items")
} catch {
print("Error: \(error)")
}
loading = false
}
}
struct ItemDetailView: View {
let item: Item
@Environment(\.dismiss) var dismiss
var body: some View {
ScrollView {
VStack(alignment: .leading, spacing: 16) {
Text(item.title).font(.title2).fontWeight(.bold)
Text(item.description).font(.body)
Text("Price: $\(String(format: "%.2f", item.price))")
.font(.headline).foregroundColor(.blue)
Spacer()
}
.padding()
}
.navigationBarTitleDisplayMode(.inline)
}
}
struct ProfileView: View {
@ObservedObject var viewModel: UserViewModel
@State var isLoading = true
var body: some View {
NavigationView {
ZStack {
if viewModel.isLoading {
ProgressView()
} else if let user = viewModel.user {
VStack(spacing: 20) {
Text(user.name).font(.title).fontWeight(.bold)
Text(user.email).font(.subheadline)
Button("Logout") { viewModel.logout() }
.foregroundColor(.red)
Spacer()
}
.padding()
} else {
Text("No profile data")
}
}
.navigationTitle("Profile")
.task {
await viewModel.fetchUser(id: UUID())
}
}
}
}
struct Item: Codable, Identifiable {
let id: String
let title: String
let description: String
let price: Double
}
xiaohongshu
technical spec
product ux expert
database patterns
Conduct multi-agent task orchestration and workflow coordination.
Initialize project with Conductor artifacts (product definition,
Expert in web animations, transitions, and motion design using Framer Motion and CSS
Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...
PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.
Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...
Display project status, active tracks, and next actions
Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.
Generate, edit, and beat-sync AI video with leading models in one workspace.
The world's fastest calendar for remote work
Transform Your Design with AI Designer by ImgCreator.ai
Revolutionizing Video Production with AI-Powered Creativity
Extend an image past the frame and let AI fill the new aspect ratio.
Discover your celebrity doppelgänger with StarByFace!
ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.
Opus.ai: Revolutionize Your Web Experience