위의 3가지 중 하나의 타입임, 모두의 역할이 다 다름
객체: 하나 이상의 역할을 수행하는 메서드와 데이터의 묶음, 재사용할 수 있는 독립적인 기능 모듈
속성(property)과 함께 함수(method)로 구성됨
class MyCar {
var price: Float = 0 // 프로퍼티(property) 또는
var name: String = "Tesla" // 인스턴스 변수(instance variable)라고 부름
init(carPrice: Float, carName: String) {
price = carPrice
name = carName
}
deinit {
// 클래스가 소멸하기 전에 수행하는 곳
}
func printResult() { // 인스턴스 메서드
print("print")
}
class func getMaxPrice() -> Float { // class 메서드
return 1000.00
}
}
MyCar 클래스의 인스턴스 생성, 초기화하기
var exampleCar: MyCar = MyCar() // 초기화, init (initialization)
var exampleCar1: MyCar = MyCar(
carPrice: 700.0,
carName: "Tesla"
)
클래스가 소멸하기 전에 해야할 일들은 deinit에 작성함
라이프사이클 Life Cycle : init - func - deinit 순으로 실행됨
var yourcar = exampleCar1.carName // yourcar 변수에 "Tesla" 값 저장
exampleCar1.carName = "KIA" // 클래스 안의 프로퍼티 값 변경
exampleCar1.printResult() // 클래스 안의 메서드(인스턴스 메서드) 호출
var maxPrice = MyCar.getMaxPrice() // 클래스 메서드 호출
저장 프로퍼티(stored property) - 상수나 변수에 담기는 값
연산 프로퍼티(computed property) - 계산이나 로직에 따라 처리된 값
연산 프로퍼티는 getter를 생성, 선택적으로 setter도 생성
class MyCar {
var price: Float = 0 // 여기는
var name: String = "Tesla" // 전부 다
var tax: Float = 10 // 저장 프로퍼티
var minusTax: Float { // 연산 프로퍼티
get { // getter
return price - tax
}
set { // setter (선택 사항)
price = newPrice - tax
}
}
init(carPrice: Float, carName: String) {
price = carPrice
name = carName
}
함수로도 만들어 사용할 수 있지만 코드가 더 깔끔해짐
get, set 하나씩 메서드를 만들어야 하지만 연산 프로퍼티 하나를 적으면 끝!
지연 저장 프로퍼티 - lazy
대부분 self는 선택적으로 사용
사용해야하는 상황 -> 프로퍼티나 메서드를 클로저 표현식 내에서 참조할 경우
클로저 표현식에서는 반드시!! self를 사용해야 함!
또한, 함수의 매개변수와 클래스 프로퍼티가 이름이 같을 경우 사용해야함
// 클래스 안이라고 가정
var age: Int = 10
func getAge(age: Int) {
print(age) // 함수의 매개변수
print(self.age) // 클래스 프로퍼티
}
self 사용 여부는 개발자에 따라 다르다! 마음가는대로~ 안써도 되는 상황이면 안쓰려고 생각중!
불투명한 반환 타입은 프로토콜 앞에 some 키워드를 붙임
이걸 쓰면 모든 타입이 반환될 수 있도록 해줌
func exampleFunc(value: Int) -> some Equatable { // Equatable 은 프로토콜
value * 2
}
이 내용은 추후에 프로토콜 개념을 다룰때 좀 더 자세히 하는걸로!
SwiftUI 에서 자주 쓰인다고 함