본문 바로가기
아이폰 개발/Swift

swift 메소드 정리

by 인생여희 2022. 10. 31.

swift 메소드 정리

 

메서드

메서드는 특정 타입에 관련된 함수를 뜻한다.

 

스위프트에서 클래스, 구조체, 열거형 은 인스턴스 메서드를 정의할 수 있다.

 

또한 타입 자체와 관련된 기능을 실행하는 타입 메서드를 정의할 수도 있다.

 

인스턴스 메서드

인스턴스 메서드는 특정 타입의 인스턴스에 속한 함수를 뜻한다.

 

인스턴스 내부의 프로퍼티 값을 변경하거나 특정 연산 결과를 반환하는 등 인스턴스와 관련된 기능을 실행한다.

 

인스턴스 메서드는 인스턴스가 존재할 때만 사용할 수 있다.

 

참고로 아래 코드에서 LevelClass의 인스턴스 메서드가 level 인스턴스 프로퍼티의 값을 수정한다.

 

자신의 프로퍼티 값을 수정할 때 클래스의 인스턴스 메서드는 크게 신경 쓸 필요가 없다.

 

하지만 구조체나 열거형은 값 타입이므로 메서드 앞에 mutating 키워드를 붙여서 해당 메서드가 인스턴스 내부의 값을 변경한다는것을 명시해야 한다.

 

class LevelClass{
    
    var level:Int = 0 {
        didSet{
            print("Level:\(level)")
        }
    }
    
    // 레벨 업
    func levelUp(){
        print("레벨업!")
        level += 1
    }
    
    
    // 레벨 감소
    func levelDown(){
        print("레벨다운!")
        level -= 1
        if level < 0 {
            reset()
        }
    }
    
    
    // 특정 레벨 이동
    func jumpLevel(to:Int){
        print("jump to \(to)")
        level = to
    }
    
    // 리셋
    func reset(){
        print("reset!")
        level = 0
    }
}


var levelClassInstance:LevelClass = LevelClass()
levelClassInstance.levelUp()
//레벨업!
//Level:1

levelClassInstance.levelDown()
//레벨다운!
//Level:0

levelClassInstance.levelDown()
//Level:-1
//reset!
//Level:0

levelClassInstance.jumpLevel(to: 5)
//jump to 5
//Level:5


print("")


struct LevelStruct{
    
    var level:Int = 0 {
        didSet{
            print("struct - Level:\(level)")
        }
    }
    
    // 레벨 업
    mutating func levelUp(){
        print("struct - 레벨업!")
        level += 1                  //Left side of mutating operator isn't mutable: 'self' is immutable
    }
    
    
    // 레벨 감소
    mutating func levelDown(){
        print("struct - 레벨다운!")
        level -= 1
        if level < 0 {
            reset()
        }
    }
    
    // 특정 레벨 이동
    mutating func jumpLevel(to:Int){
        print("struct - jump to \(to)")
        level = to                  //Cannot assign to property: 'self' is immutable
    }
    
    // 리셋
    mutating func reset(){
        print("struct - reset!")
        level = 0
    }
}

var levelStructInstance : LevelStruct = LevelStruct()
levelStructInstance.levelUp()
//struct - 레벨업!
//struct - Level:1


levelStructInstance.levelDown()
//struct - 레벨다운!
//struct - Level:0

 

self  프로퍼티

모든 인스턴스는 암시적으로 생성된 self 프로퍼티를 갖는다.

 

self는 자기자신을 가리키는 프로퍼티이다.

 

스위프트는 변수를 사용할때 자동으로 메서드 내부에 선언된 1.지역변수를 먼저 사용하고, 그 다음 2.매개변수, 3.인스턴스의 프로퍼티 순으로 사용을 한다.

 

또한, self 프로퍼티의 다른 용도는 값 타입 인스턴스 자체의 값을 치환할 수도 있다.

 

클래스와 인스턴스는 참조타입이라 self 프로퍼티에 다른 참조를 할당 할 수 없다.

 

구조체나 열거형 등은 self 프로퍼티를 사용하여 자신 자체를 치환할 수도 있다.

 

class LevelClassTwo{
    var level : Int = 0
    func reset() {
        //self = LevelClassTwo()    //Cannot assign to value: 'self' is immutable
    }
}



struct LevelStructTwo{
    
    var level:Int = 0 {
        didSet{
            print("struct - Level:\(level)")
        }
    }
    
    // 레벨 업
    mutating func levelUp(){
        print("struct - 레벨업!")
        level += 1
    }
    

    // 리셋
    mutating func reset(){
        print("struct - reset!")
        self = LevelStructTwo()
    }
}

print("")

var leveStructInstanceTwo = LevelStructTwo()
leveStructInstanceTwo.levelUp()
//struct - 레벨업!
//struct - Level:1
print(leveStructInstanceTwo.level)  //1

print("")

leveStructInstanceTwo.reset()           //struct - reset!
print(leveStructInstanceTwo.level)      //0



enum OnOffSwitch{
    case on, off
    mutating func nextState(){
        self = self == .on ? .off : .on
    }
}

 

 

test.zip
0.02MB