swift

swift - Protocols #3 (Method Requirements)

행복하게사는게꿈 2021. 1. 12. 18:20

// 프로토콜에서 메소드를 선언하고 형식에서 메소드 요구사항을 구현
// {}와 method body는 선언하지 않음

// 프로토콜을 값 형식이 채용할 수 있고 메소드 내부에서 속성값을 변경해야 한다면 mutating 키워드를 추가해야 한다.
// 이 경우 값 형식 전용이라고 생각할수도있지만 프로토콜에서의 mutating은 메소드에서 속성을 변경할 수 있어야 한다는 요구사항을 표현할 뿐 -> 참조형식에서도 문제없이 채용 할 수 있음

protocol ResetTable {
    mutating func reset()
    
    static func reset2()
}

class Size: ResetTable {
    var width = 0.0
    var height = 0.0
    
    // 여기서는 mutating 키워드를 붙이지 않아도 자유롭게 사용가능하다
    func reset() {
        width = 0.0
        height = 0.0
    }
    
    // static으로 키워드를 붙이면 overriding을 허용 x
    // static 대신 class로 하면 overriding 허용 하면서 프로토콜 요구사항도 만족
    class func reset2() {
        <#code#>
    }
}

struct Size2: ResetTable {
    var width = 0.0
    var height = 0.0
    
    // 값 형식의 struct 구조체에서 속성값을 변경하려면 func 키워드 앞에 mutating 키워드를 붙여야 한다.
    mutating func reset() {
        width = 0.0
        height = 0.0
    }
    
    static func reset2() {
        <#code#>
    }
}