1. 속성
1.1) 저장속성/ 지연속성 (열거형 불가)
struct Bird {
var name = "새" //저장속성
var seight = 0.0 //저장속성
func fly() {
print("날아갑니다.")
}
}
클래스/ 구조체의 틀에서 찍어낸 인스턴스가 가지는 고유의 데이터 저장 공간
변수나 상수로 선언이 가능
객체의 초기화시, 각 저장속성은 반드시 값을 가져야 한다. (nil가능)
1.2)지연저장속성
class AView {
var a: Int = 0
lazy var view = UIImageView() //지연저장속성
lazy var b: Int = { //지연저장속성
return a*10
}
}
지연저장속성은 처음부터 초기화가 필요하지않은 경우 초기화를 지연시킴 (메모리낭비 감소)
lazy let은 불가능
생성자에서 초기화하지 않기 때문에 반드시 기본값이 필요
2) 계산속성
class Person {
var name = "사람"
var h = 160.0
var w = 60.0
var bmi: Double{
get{ //get블록
return w/(h*h)*10000
}
set { //set블록
w = newBalue*h*h/10000
}
}
}
p.bmi //get>> 밖에서 접근해서 값을 얻기
p.bmi = 23.4 //set>> 밖에서 값을 세팅하기
속성의 형태지만 실질적으론 메서드 >> 메서드를 속성처럼 만든것
메서드이기 때문에 인스턴스에 메모리공간이 할당되어 있지 않음
var로만 선언가능, 형식 추론이 될 수 있도록 자료형까지 선언해애ㅑ함
get블록은 읽기전용. 필수
set블록은 읽기/쓰기 가능. 선택
set블록에서 기본 파라미터 newValue가 제공됨
3) 타입속성
3.1) 저장타입속성
class Circle {
static let pi = 3.141562 //저장타입속성
static var count = 0
...
}
모든 인스턴스가 동일하게 가져야하는 보편적인 속성이거나,
모든 인스턴스가 공유해야하는 성격에 가까운 저장속성을 저장타입속성으로 선언
static키워드 사용(상속시)재정이불가.
항상 기본값(초기값 필요)
자체적으로 지연속성의 성격을 가지므로, 호출시 메모리 할당
3.2)계산타입속성
class Circle {
static let pi = 3.141526
...
static var multPi: Double { //계산타입속성
return pi*2
}
...
}
(상속시)재정의가능
static 또는 class키워드 사용
메서드이기 때문에 메모리공간이 할당되어있지 않음
4) 속성감시자
class Priofile {
...
var sMessage: String = "기본메세지" {
willSet {
print("\(sMessage) -> \(newValue)")
}
didSet {
print("\(oldValue) -> \(sMessage)")
}
}
...
}
willSet : 값이 변할때 새 값이 저장되기 직전에 호출됨
didSet - 값이 변할때 새 값이 저장된 직후에 호출됨
지연저장속성은 관찰안됨
저장속성의 변화시점을 관찰하는 실질적 메서드
일반적으로 willSet보단 didSet을 더 많이 구현
<속성감시자 추가가 가능한 경우>
저장속성(상속한 저장속성은 재정의 불가, 감시자 추가는 가능
상속한 계산속성을 재정의해 속성관찰자 추가 가능(단순 메서드 추가일뿐)
2. 메서드
1) 인스턴스 메서드
class Dog {
var name: String
var weight: Double
...
func sit() { //인스턴스메서드
print("\(name)가 앉았습니다.")
}
...
}
인스턴스에 메모리공간이 할당되어 있지 않음
메서드 접근시, 인스턴스 이름으로 접근해야 함 >> instance.method()
값타입의 인스턴스 메서드에서 인스턴스 고유의 (저장)속성을 수정할 수 없음
(수정하려면 mutating)
예를들자면
클래스의 인스턴스메서드
func changeName(name: String) {
self.name = name
}
구조체(열거형)의 인스턴스메서드
mutatingfunc changeName(name: String) {
self.name = name
}
2) 타입 메서드
class Dog {
static var species = "Dog"
var name: String
var weight: Double
...
static func saySpec() {
print("\(species)입니다.")
}
...
}
Dog.saySpec() //이렇게 실행
메서드이지만, 인스턴스 성격이 아니고 타입자체 성격에 가까운 메서드
인스턴스 기능이 아닌, 타입 짜체에 필요한 기능 구현시 사용
타입 자체가 가져야 하는 공통된 기능(동작)구현
메모리공간이 할당되어 있지 않음
Type.method()로 접근해야함
static(상속불가능)또는 class(상속가능)키워드 사용
3) 서브스크립트
대괄호를 사용하는 문법(배열/딕셔너리)
대괄호는 사실, 특별한 형태의 메서드(기능)호출 역할 >> 메서드를 직접 구현도 가능
3.1)인스턴스서브스크립트
class SomeData {
var datas = ["A", "B", "C", "D"]
subscript(index: Int) -> String { //인스턴스 서브스크립트
get{
return datas[index]
}
set {
datas[index] = newValue
}
}
}
subscript로 명명됨
파라미터 생략불가, 리턴형 생략불가
메모리공간이 할당되어있지않음
인스턴스 이름으로 접근해야함 >> instance[파라미터]
파라미터 2개이상도 구현가능
get블록만 선언 >> 읽기전용 (필수)
set블록까지 >> 선택
3.2) 타입서브스크립트
서브스크립트 메서드 앞에 static 또는 class키워드만 붙이면 됨
이 포스팅은 인프런에있는 엘런의 스위프트를 참고하여 작성하였습니다.
'swift문법' 카테고리의 다른 글
| 참고) 싱글톤패턴 (2) | 2022.08.23 |
|---|---|
| 참고) 접근제어 (1) | 2022.08.23 |
| [Swift] Part11_클래스와 구조체 (0) | 2022.08.20 |
| [Swift] Part10_열거형 (0) | 2022.08.11 |
| [Swift] Part9_컬렉션 (0) | 2022.08.11 |