FE 공부/Swift

Swift _ Method & Subscript

꼬질꼬질두부 2022. 10. 10. 23:55

Method

클래스, 구조체, 열거형과 같은 특정 형식에 속한 함수
Instance method : Instance에 연관된 method
Instance를 생성해야만 호출 가능
func으로 시작하는 메소드
func name(parameters) -> ReturnType {
	Code
}

instance.method(parameters) //instance 이름을 통해 호출

//example

class Sample {
	var data = 0
    static var shareData = 123
    
    func doSomething() {
    	print(data)
        Sample.sharedData
    }
    
    func call() {
    	doSomething()
    }
}

let a = Sample()
a.data
a.doSomething()
a.call

class Size {
	var width = 0.0
    var height = 0.0
    
    func enlarge() {
    	width += 1.0
        height += 1.0
    }
} // 만약 구조체로 바꾼다면 mutating func enlarge()로 바꿔야함

let s = Size() // 만약 구조체로 바꾼다면 var s로 사용
s.enlarge()

 

Type Method : 형식에 연관된 method
Instance 생성 없이 Type 이름만 알면 호출 가능
func대신 static, class가 붙음
- static의 경우 overriding 금지
- class의 경우 overriding 허용
static func name(parameters) -> Return Type {
	statements
} //first class에서 overriding(method 변형) 허용을 안 할 때 사용

class func name(parameters) -> Return Type {
	statements
} //first class에서 overriding(method 변형)하고자 할 때 사용

Type.method(parameters)

//example

class Circle{
	static let pi = 3.14
    var radius = 0.0
    
    func getArea() -> Double{
    	return radius * radius * Circle.pi
    }
    
    static func printPi() {
    	print(pi)
    }
}

Circle.printPi() //3.14

 

Subscript

클래스, 구조체, 열거형에서 시퀀스의 멤버 요소에 접근하기 위한 바로가기 첨자로, 단일 타입에 여러 스크립트를 정의할 수 있다.
-> 쉬운 예시 _ 배열의 인덱스, 딕셔너리의 키 값으로 value값 찾기

 

instance[index]
instance[key]
instance[range]

let list = ["A","B","C"]
list[0] //"A"

//직접 구현하기
subscript(parameters) -> ReturnType { 
//가변 parameter 사용 가능 but, 입출력 parameter 선언 or 기본값 지정 or 생략 불가
//ReturnType은 리턴되는 값의 형식이며 저장하는 값의 형식 > 생략 불가 	
    
    get{
    	return expression
    }
    
    set(name) {
    	statement
    }
    
//get & set을 통해 값을 읽고 쓸 수 있음
//set 블록을 생략 시 읽기 전용
//값은 읽어야하기 때문에 get 생략은 불가 
}

//example
class List{
	var data = [1,2,3]
    
    subscript(index: Int) -> Int{
    	get{
    		return data[index]
    	}
    
    	set{
    		data[index] = newValue
    	}
    }
}

var l = List()
l{0} //1 _ get 블록 실행
l[1] = 123 _ set 블록 실행되고 123으로 업데이트