1. 인스턴스 메서드
가장 기본적인 메서드
- 메서드 접근시, 인스턴스 이름으로 접근 -> instance.method()
- 값타입의 인스턴스(구조체, 열거형)의 인스턴스메서드에서는 인스턴스 고유의 프로퍼티 수정을 할 수 없음
(수정할려면 mutating 키워드 필요)
class aClass {
var num: Int
init(num: Int) {
self.num = num
}
func changeNumber(_ newNum: Int) { // 인스턴스 메서드
num = newNum
print("newNum --> \(newNum)")
}
func changeNumber() { // 오버로딩 지원
print("숫자바꿈")
}
}
var aa = aClass(num: 10)
aa.changeNumber(20) // 인스턴스 메서드 실행
/* 콘솔
newNum --> 20
*/
struct bStruct {
var num: Int
init(num: Int) {
self.num = num
}
mutating func changeNumber(_ newNum: Int) { // 값형식의 인스턴스 메서드에서 인스턴스 고유의
num = newNum // 수정시 mutating 키워드를 붙여줘야 한다
print("newNum --> \(newNum)")
}
}
var bb = bStruct(num: 10)
bb.changeNumber(20) // 인스턴스 메서드 실행
/* 콘솔
newNum --> 20
*/
2. 타입메서드
인스턴스에 속한 메서드가 아닌 타입 자체에 속한 메서드이기에 접근시 Type.method()로 접근해야함
- static 또는 class키워드를 사용한다(class 키워드를 붙이면 상속시 재정의가 가능하다 -> class 키워드는 class에서만 사용)
class aClass {
static var num: Int = 10
init() {
}
static func printNum() {
print("num --> \(num)")
}
class func printNum2() {
print("num --> \(num)")
}
}
var aa = aClass()
//aa.printNum() // 인스턴스에서 접근 불가능
aClass.printNum() // 타입으로 접근
/* 콘솔
num --> 10
*/
aClass.printNum2()
class bClass: aClass { // aClass를 상속한 bClass
override class func printNum2() { // class키워드를 사용한 타임메서드는
print("출력안할거임ㅅㄱ") // 상속시 override 키워드를 사용해서 재정의 가능
}
// override static func printNum() { } // static키워드는 재정의 불가능
}
bClass.printNum2()
/* 콘솔
num --> 10
출력안할거임ㅅㄱ
*/
3. 서브스크립트
대괄호를 이용하여 접근가능
ex) 배열[index], 딕셔너리[key]
- 메서드 구현시 func 키워드가 아닌 subscript 키워드 사용
- 메서드 접근시 instance[파라미터] 형식으로 접근
- 파라미터 2개 이상도 구현가능
- get블록(필수구현)이랑 set블록(선택구현) 존재
- set블록에는 기본 파라미터 newValue가 제공 (set(파라미터) 형식으로 직접 파라미터 이름 설정도 가능)
- 서브스크립트 메서드 앞에 static 또는 class 키워드를 붙이면 타입서브스크립트가 됨
class aClass {
var multipleNum: Int = 2
subscript(num: Int) -> Int { // get블록만 구현시엔 get 키워드 생략가능
return multipleNum * num
}
}
let aa = aClass()
aa[1] // 2
aa[2] // 4
aa[3] // 6
class bClass {
var arr = [1, 3, 5, 7, 9]
subscript(index: Int) -> Int {
get {
return arr[index]
} set {
arr[index] = newValue
}
}
}
let bb = bClass()
bb[0] // 1
bb[0] = 100 // set블록 수행
bb[0] // 100
enum Name: Int {
case Jimin, Minji, Chulsu
static subscript(index: Int) -> Self? {
if let name = Name(rawValue: index) {
return name
} else {
return nil
}
}
}
let name = Name[0] // Jimin
let name2 = Name[2] // Chulsu
let name3 = Name[5] // nil