아리의 iOS 탐구생활

[Swift] Protocol 2) 속성(Property)의 대한 요구사항 본문

Swift/문법

[Swift] Protocol 2) 속성(Property)의 대한 요구사항

Ari Lee 2021. 8. 18. 17:57
반응형

 

Property Requirments

 

프로토콜에서는 프로퍼티가 저장프로퍼티인지 연산프로퍼티인지 명시하지 않고, 이름과 타입 그리고 gettable, settable한지 명시한다. 프로퍼티는 항상 var로 선언해야 한다. 프로토콜에서의 var 키워드는 가변성과는 아무런 관계가 없다. 대신 선언하는 멤버가 프로퍼티라는 것을 나타낸다.

protocol Protocols { 
    var name: String { get set }
    static var age: Int { get set }
}

 

get과 set이 모두 포함되어있다면 형식에서 읽기와 쓰기가 가능한 프로퍼티로 구현해야하고,

get만 포함되어있는 경우에는 읽기 가능하도록 구현하면 된다.

타입 프로퍼티로 선언할때는 var 키워드 앞에 static을 추가해주면 된다.

 

 

 

 

👉🏻   get만 설정해주었을 때

protocol Test {
    var name: String { get }
}

struct A: Test {
    var name: String // 읽기만 가능하도록 구현
}
struct B: Test {
    var name: String = "Ari Lee" // 반드시 읽기만 가능하도록 구현하지 않아도 된다.
}

 

 

 

 

👉🏻   get set 둘다 설정해주었을 때

protocol TestT {
    var name: String { get set }
}

struct C: TestT {
    /*
     let name: String = "Ari Lee" note: candidate is not settable, but protocol requires it
     ~~~ ^
     var
     */
    var name: String = "Ari Lee" // 읽기 쓰기 모두 가능해야하기 때문에 let 선언은 불가하다.
}
struct D: TestT {
    var name: String {
        get {
           return "Ari Lee"
        }
        set {
            
        }
    }
}

 

 

 

 

👉🏻 static을 이용하여 타입 프로퍼티를 정의해줬을 때.

주의 : 클래스 안에 static키워드로 선언된 프로퍼티는 서브클래스로 상속은 가능하지만 오버라이딩은 불가능하다. 따라서 오버라이딩을 허용하려면 static 대신 class 타입으로 선언해줘야 한다.
protocol TestTe {
    static var name: String { get set }
}

struct E: TestTe {
    static var name: String = "Ari Lee" // 프로퍼티 앞에 타입을 필수적으로 추가해줘야 한다.
}

class F: TestTe {
//    static var name: String {
//        get {
//            return "Ari Lee"
//        }
//        set {
//
//        }
//    }
//    static 타입은 상속은 가능하지만 오버라이딩은 불가능하다
    
    class var name: String {
// static에서 class로 변경하여도 여전히 타입 프로퍼티이다. 이름과 자료형, 가변성도 동일하다.
        get {
            return "Ari Lee"
        }
        set {
            
        }
    }
// 그래서 프로토콜의 요구사항을 충족시킨다. 서브클래스에서 오버라이딩하는 것도 가능하다.
}

 

 

 

 

✔️  Reference

 

Protocols — The Swift Programming Language (Swift 5.5)

Protocols A protocol defines a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality. The protocol can then be adopted by a class, structure, or enumeration to provide an actual implementation of tho

docs.swift.org

 

반응형
Comments