본문 바로가기
모바일앱/Swift

메소드 개념 ( + extension)

by GeekCode 2021. 10. 14.
반응형

 

 

Method 는 function과 마찬가지로 기능을 담당한다.

스트럭트와 관련 된 메소드

 

1. 스트럭트 생성, 함수생성, 인스턴스 생성

//스트럭트 생성
struct Lecture {
    var title: String
    var maxStudent: Int = 10
    var numOfRegistered = 0
}

//인스턴스 생성
var lec = Lecture(title: "iOS Basic")

func remainSeats(of lec: Lecture) -> Int{
    let remainSeats = lec.maxStudent - lec.numOfRegistered
    return remainSeats
}

remainSeats(of: lec) //10

 

2. 관계된 함수를 만들고 스트럭트에 메서드로 구현하기

오브젝트는 서로 관계되어있는 것을 묶는 것인데 함수가 스트럭트에 관련있는 것 처럼 보이면 스트럭트 안에 넣어줘도 된다.

 

스트럭트에 메서드를 만드는 중 경고창이 나타났다.

// --> 경고창 Left side of mutating operator isn't mutable: 'self' is immutable

// 메서드를 실행하면 전체 스트럭트의 프로퍼티를 변형한다고 경고하는 것.  좌측에 mutating 입력할것

 

import UIKit

////스트럭트 생성
//struct Lecture {
//    var title: String
//    var maxStudent: Int = 10
//    var numOfRegistered = 0
//}
//
////인스턴스 생성
//var lec = Lecture(title: "iOS Basic")
//
//func remainSeats(of lec: Lecture) -> Int{
//    let remainSeats = lec.maxStudent - lec.numOfRegistered
//    return remainSeats
//}
//
//remainSeats(of: lec) //10



//--> 오브젝트는 관계되어있는 것을 묶었고 스트럭트도 그래서 묶었는데 이 함수가 렉쳐에 들어가도될것 같다.
struct Lecture {
    var title: String
    var maxStudent: Int = 10
    var numOfRegistered = 0
    
    func remainSeats() -> Int{
        let remainSeats = lec.maxStudent - lec.numOfRegistered
        return remainSeats
    }
    
// --> 경고창 Left side of mutating operator isn't mutable: 'self' is immutable
    // 메서드를 실행하면 전체 스트럭트의 프로퍼티를 변형한다고 경고하는 것.  좌측에 mutating 입력할것
    mutating func register() {
        // 등록한 학생수 증가시키기
        numOfRegistered += 1
    }
    
//type property 렉쳐의 타입과 관련된 것이라면 바로 접근하게 하는 것
    static let target: String = "Anybody want to learn something"
//type Method
    static func 소속학원이름() -> String {
        return "패캠"
    }
}
var lec = Lecture(title: "iOS Basic")

lec.remainSeats() //10

//렉쳐에 사람들이 등록을 하는 함수 , 먼저 lec에서 뭘 하고 싶다는 메서드를 만들고 구현하기
lec.register()
lec.register()
lec.register()

lec.register()
lec.register()
lec.register()

lec.remainSeats() //4

Lecture.target //"Anybody want to learn something"
Lecture.소속학원이름() //"패캠"

 

 

extension 메서드 만들기

스트럭트의 바깥에서 기존의 스트럭트의 기능에 추가할 수 있다.

기존의 작업에 지장을 주지않는 것이 나을 때도 있다.

// 절대값을 구하는 Math 스트럭쳐
struct Math {
    static func abs(value: Int) -> Int{
        if value > 0 {
            return value
        } else {
            return -value
        }
    }
}

Math.abs(value: -20) //20

//만약 여기에 제곱과 절반을 구하는 기능을 추가하고 싶다면??
// Math의 기능을 확장
extension Math {
    static func square(value: Int) -> Int{
        return value * value
    }
    static func half(value: Int) -> Int{
        return value/2
    }
}

Math.square(value: 5) //25
Math.half(value: 20) //10


// 처음부터 Math에 다 넣으면 되지 않을까?
// -> 기존에 있던 코드를 재정의를 하려면 항상 위에 추가하는게 정답은 아니다.

// 예) 애플에서 정의한 Int 에  제곱과 반값을 넣고 싶다면??

var value: Int = 3
//먼저 생성하고 구현할것
//value.square()
//value.half()

extension Int {
    func square() -> Int{
        return self * self
    }
    func half() -> Int {
        return self/2
    }
}
//
value.square() //9
value.half() //1 3나누기 2의 몫은 1

value = 10
value.square() //100
value.half() //5

 

반응형