스피드 문법정리

16. Method and Subscript

Beginner Programmer 2020. 6. 19. 10:58

Method

Instance Method

특정형식에 속한 함수, 인스턴스를 통해 호출, 함수는 특정형식에 연관되지않은 동작을 구현, 메소드는 특정형식에 연관된 동작을 구현, 클래스, 열거형 구조체에서 구현 가능, 

func name(parameters) -> ReturnType {
    Code
}
instance.method(parameters)
class Simple {
    var data = 0
    static var sharedData = 123
    
    func doSomething() {
        print(data)
        Sample.sharedData
    }
    func call() {  // 인스턴스 메소드에서 다른 인스턴스 메소드맴버에 접근할 때는 self를 생략하고 이름으로 접근
        doSomething()
    }
}
let a = Sample()
a.data // data는 인스턴스 속성이기 때문에 인스턴스 이름을 통해 접근
a.doSomething() // doSomething은 인스턴스 메소드이기 때문에 인스턴스 이름을 통해 접근
a.call()

클래스에서는 인스턴스 메소드가 인스턴스 속성을 얼마든지 바꿀수 있지만 구조체에서는 메소드를 mutating으로 선언해야함

값 형식에서 인스턴스의 가변성은 맴버의 가변성에도 영향을 줌

struct Size {
    var width = 0.0
    var height = 0.0
    
    mutating func enlarge() {
        width += 1.0
        heigth += 1.0
    }
}
var s = Size()
s.enlarge()

Type Method

static func name(parameters) -> ReturnType {
    statments
}

class func name(parameters) -> ReturnType {
    statements
}
Type.method(parameters)
class Circle {
    static let pi = 3.14
    var radius = 0.0
    
    func getArea() -> Double {
        return radius * radius * Cirlce.pi
    }
    static func printPi () { //타입메소드는 타입이름없이 타입속성에 바로 접근 가능
        print(pi)
    }
}
class Circle {
    static let pi = 3.14
    var radius = 0.0
    
    func getArea() -> Double {
        return radius * radius * Cirlce.pi
    }
    class func printPi () { //타입메소드는 타입이름없이 타입속성에 바로 접근 가능
        print(pi)
    }
}

class StrokeCircle : Circle {
    override static func printPi() {
        print(pi)
    }
}

Subscripts

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

subscript(parameters) -> ReturnType {
    get {
        return expression
    }
    set(name) {
        statements
    }
}
class List {
    var data = [1, 2, 3]
    
    subscripts(i index : Int) -> Int {
        get {
            return data[index]
        }
        set {
            data[index] = newValue
        }
    }
}

var l = List()
l[i : 0] // 1
l[i : 1] = 123 // 123
struct Matrix {
    var data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    
    subscript(row : Int, col : Int) -> Int {
        return data [row][col]
    }

}
let m = Matrix()
m[0, 0] // 1