
가장 기본적인 형태의 프로퍼티로, 값을 직접 저장하는 인스턴스 프로퍼티입니다.
class Person {
var name: String // 변수 저장 프로퍼티
let birthDate: Date // 상수 저장 프로퍼티
init(name: String, birthDate: Date) {
self.name = name
self.birthDate = birthDate
}
}
값을 저장하지 않고 계산된 값을 반환하는 프로퍼티입니다.
struct Circle {
var radius: Double
var area: Double {
get {
return .pi * radius * radius
}
set {
radius = sqrt(newValue / .pi)
}
}
}
인스턴스가 아닌 타입 자체에 속하는 프로퍼티입니다.
struct Math {
static let pi = 3.141592653589793
static var computedProperty: Int {
return 42
}
}
필요한 시점에 초기화되는 프로퍼티입니다.
class ExpensiveDataManager {
lazy var data: [String] = {
// 복잡한 초기화 로직
return ["Heavy", "Data", "Loading"]
}()
}
프로퍼티 값의 변화를 관찰하고 반응하는 기능을 제공합니다.
class StepCounter {
var steps: Int = 0 {
willSet {
print("Will set steps to \(newValue)")
}
didSet {
print("Steps changed from \(oldValue) to \(steps)")
}
}
}
View의 로컬 상태를 관리하는 프로퍼티 래퍼입니다.
struct ContentView: View {
@State private var isPlaying = false
var body: some View {
Button(action: { isPlaying.toggle() }) {
Text(isPlaying ? "Pause" : "Play")
}
}
}
다른 View의 상태와 양방향 바인딩을 제공합니다.
struct ChildView: View {
@Binding var text: String
var body: some View {
TextField("Enter text", text: $text)
}
}
struct ParentView: View {
@State private var text = ""
var body: some View {
ChildView(text: $text)
}
}
클래스의 상태 변화를 감지하고 UI를 업데이트합니다.
@Observable class UserProfile {
var name = "Kim"
var age = 25
func updateAge() {
age += 1
}
}
시스템 환경 값에 접근합니다.
struct ThemedText: View {
@Environment(\.colorScheme) var colorScheme
var body: some View {
Text("Current theme: \(colorScheme == .dark ? "Dark" : "Light")")
.foregroundColor(colorScheme == .dark ? .white : .black)
}
}
UserDefaults와 연동되어 데이터를 영구 저장합니다.
struct SettingsView: View {
@AppStorage("isDarkMode") private var isDarkMode = false
var body: some View {
Toggle("Dark Mode", isOn: $isDarkMode)
}
}
현재 scene의 상태를 저장합니다.
struct DocumentView: View {
@SceneStorage("selectedTab") private var selectedTab = 0
var body: some View {
TabView(selection: $selectedTab) {
Text("Tab 1").tag(0)
Text("Tab 2").tag(1)
}
}
}
Core Data 쿼리 결과를 관리합니다.
struct TodoListView: View {
@FetchRequest(
sortDescriptors: [SortDescriptor(\Todo.date, order: .reverse)],
animation: .default)
private var todos: FetchedResults<Todo>
var body: some View {
List(todos) { todo in
Text(todo.title ?? "Untitled")
}
}
}
ObservableObject의 수명주기를 관리합니다.
class DataModel: ObservableObject {
@Published var value = 0
}
struct DataView: View {
@StateObject private var model = DataModel()
var body: some View {
Text("Value: \(model.value)")
}
}
@Observable class UserProfile {
var name: String
var email: String
var preferences: Preferences
struct Preferences {
var isDarkMode: Bool
var notificationsEnabled: Bool
}
init(name: String, email: String, preferences: Preferences) {
self.name = name
self.email = email
self.preferences = preferences
}
}
struct ProfileView: View {
@State private var profile: UserProfile
@AppStorage("lastLoginDate") private var lastLoginDate: Date?
var body: some View {
Form {
Section("Personal Info") {
TextField("Name", text: $profile.name)
TextField("Email", text: $profile.email)
}
Section("Preferences") {
Toggle("Dark Mode", isOn: $profile.preferences.isDarkMode)
Toggle("Notifications", isOn: $profile.preferences.notificationsEnabled)
}
if let date = lastLoginDate {
Section("Last Login") {
Text(date, style: .date)
}
}
}
}
}
@State 사용 시기
@Binding 사용 시기
@Observable 사용 시기
@AppStorage 사용 시기
@Environment 사용 시기
성능 최적화
메모리 관리
코드 구조화
Swift의 프로퍼티 시스템은 강력하고 유연합니다. 기본 프로퍼티부터 SwiftUI의 다양한 프로퍼티 래퍼까지, 각각의 용도에 맞게 적절히 선택하여 사용하면 효율적인 앱 개발이 가능합니다. 특히 SwiftUI에서는 프로퍼티 래퍼를 통해 상태 관리를 더욱 쉽고 직관적으로 할 수 있습니다.
이 가이드를 통해 다양한 프로퍼티의 특성과 활용법을 이해하고, 실제 프로젝트에서 적절히 활용하시기 바랍니다.