iOS Swift - Method and Subscript

longlivedrgn·2022년 9월 2일
0

swift문법

목록 보기
14/36
post-thumbnail

Instance Method

func name(parameters) -> ReturnType {
	Code
}


instance.method(parameters)

예)

// 클래스를 생성해준다
class Sample {
    var data = 0
    static var sharedData = 123
    
    func doSomething() {
        print(data)
        Sample.sharedData
    }
    
    func call() {
        doSomething()
    }
}

// instance 생성하기
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
    }
}

let s = Size()
s.enlarge()
s.width //1
s.height //1

Struct의 경우 예)

  • mutating을 붙여준다.
    왜? -> 스위프트의 경우 class는 레퍼런스 타입이고, enum과 struct의 경우 값 타입이다. 값 타입의 경우 속성을 인스턴스 메소드 내에서 수정할 수 가 없다. 그러나 만약 mutating을 사용하면 속성을 바꿀 수 있다!
struct Size {
    var width = 0.0
    var height = 0.0

    mutating func enlarge() {
        width += 1.0
        height += 1.0
    }
}

var s = Size()
s.enlarge()
s.width
s.height

TypeMethod

  • 아래와 같이 static이 붙은 함수의 겨우 typeMethod이다. 이러한 경우 instance를 통하여 호출하는 것이 아닌, class를 통하여 호출을 할 수 있다.
class Circle {
    static let pi = 3.14
    var radius = 0.0
    
    func getArea() -> Double {
        return radius * radius * Circle.pi
    }
    
    static func printPi() {
        print(pi)
    }
}

var a = Circle()

// instance Method
a.radius // 0
a.getArea() //0

// type method
Circle.printPi() // 3.14
Circle.pi // 3.14
  • 단, static으로 된 것은 overriding이 불가능하다.
    -> 즉, 아래와 같은 코드가 불가능하다.
// static으로된 것은 overriding이 불가능하다.
class StrokeCircle: Circle {
    override static func printPi() {
        print(pi)
    }
}

Subscript

  • 콜렉션, 리스트, 시퀀스 등 집합의 특정 member elements에 간단하게 접근할 수 있는 문법

기본 형태

subscript(parameters) -> ReturnType {
	get {
    	return expression
    }
    set(name) {
    	statments
    }
}

예)

class List {
    var data = [1,2,3]

    subscript(index: Int) -> Int {
        get {
            return data[index]
        }

        set {
            data[index] = newValue
        }
    }
}

var I = List()
I[0] //1

I[1] = 123

예) - argument label을 추가해준다면?

// arguement label을 넣어주기
class List {
    var data = [1,2,3]

    subscript(i index: Int) -> Int {
        get {
            return data[index]
        }

        set {
            data[index] = newValue
        }
    }
}


var I = List()
I[i: 0] //1

I[i: 1] = 123 //123
  • 읽기전용 subscript라면(set을 생략할 수 있다.)
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]

0개의 댓글