2017-09-29 8 views
1

오늘은 약간의 손실로 인해 오늘 질문을합니다. 스위프트와 프로토콜에 관한 것이고, 프로토콜 지향 프로그래밍 (POP)에 관한 것입니다.스위프트에서 프로토콜을 사용하는 경우

나는 그것에 관한 기사, 심지어 책을 읽었지만 여전히 혼란 스럽다. 모두는 의정서가 중대한 공구다는 것을 밝힌 것을 보인다, 그러나 위에 그러나 나는 그것의 힘을 진짜로 이해하지 않는다.

개체로 볼륨을 나타내는 클래스 Volume을 코딩 중이므로 질문이 있습니다. 예를 들어,

struct Volume { 
    var value: Float = 1 
    var isLogScale: Bool = false 
    var maxLogVolume: Float = 6.0 // value in dB 
    var maxLinearVolume: Float = 1.0 
    let dynamicRange: Float = 50.0 


    func convertLinearToLog() -> Float { 
    // Do some maths 
    } 

    func otherFunction() { 
    print("Hello, I'm the most useless function in the world.") 
    } 
} 

이것은 일반적인 클래스 없음입니다.

하지만 ... 해야하는 내가 더 나은 우리 같은 프로토콜 : 다음

protocol VolumeProtocol { 
    var value: Float {get set} 
    var isLogScale: Bool {get set} 
    var maxLogVolume: Float {get set} 
    var maxLinearVolume: Float {get set} 
    let dynamicRange: Float {get} 

    func convertLinearToLog() -> Float 
    func otherFunction() 
} 

그리고는, 그래서 만약

struct MyVolumeClass: VolumeProtocol { 
// Same thing as before 
} 

난 정말이 질문에 대한 대답을 관리하지 않는 것처럼 모든 것을 구현 다시 당신 프로토콜을 사용할 때 도움이 될 수 있으며 감사하지 않을 때는 도움이됩니다.

+1

당신은 구조체와 함께 작동해야하지 않는 수업. btw https://developer.apple.com/videos/play/wwdc2015/408/ –

+1

@LeoDabus 당신은 완전히 옳습니다. 죄송합니다. 클래스/구조체에서 실수를했습니다. 실제로이 경우는 전적으로 구조체입니다. 나는 나의 질문을 편집했다.그리고 링크를 주셔서 감사합니다 – DEADBEEF

+1

일반적으로 프로토콜 사용에 대한 가능한 시나리오 중 하나는 여러 클래스의 일반적인 메소드/속성을 추상화하려는 경우이지만 어떤 이유로 든 상속을 사용하지 않으려는 경우 (예 : 클래스 이미 다른 클래스에서 상속해야 함). 현재 구현의 경우,이 프로토콜을 준수하는 여러 가지 클래스를 가지고 있다고 가정하지 않기 때문에'VolumeProtocol'을 만드는 것은 의미가 없습니다. –

답변

2

프로토콜은 하나 이상의 사용 사례를 가지고 있지만 그것을 이런 식으로 생각 : 클래스에 대한

  • 이 프로토콜은 경량 상속 계층 구조 클래스 계층 구조에서 분리 제공합니다. Animal 클래스와 Cat, Dog, Bird 및 Insect 하위 클래스가 주어지면 Bird와 Insect 만 fly 메서드를 공유한다고 지정하는 방법은 무엇입니까?

  • 구조체의 경우 프로토콜은 그렇지 않은 경우 완전히 상실된 상속 계층 구조를 제공합니다. struct에는 superstruct가 없습니다. 따라서 Bird와 struct Insect 구조체를 사용하면 메서드가 fly 인 것을 어떻게 지정하겠습니까?

지금, 당신은 새와 곤충 그냥 fly 방법이 일어날 것을 대답 할 수와 그 이야기의 끝입니다. 그러나 그것은 "fly 방법을 가진 모든 유형"세트에 대해 말할 필요가있을 때하지 않습니다. 그리고 을 수행 할 때은 컴파일러가 fly 메서드를 에있는 객체에을 가지고 fly 메서드를 전송할 수있게하려는 경우에 설정해야합니다.

protocol Flier { 
    func fly() 
} 

이제 전단지가 유형입니다 :

이 솔루션은 프로토콜입니다. 전단지가 예상된다 전단지에 적합 모든 유형의 인스턴스를 사용할 수 있으며, 컴파일러는 fly에 대한 전단지를 알려 드릴 것입니다, 그래서 문제는 해결된다 :

var myFlier : Flier = Bird() // if Bird conforms to Flier 
myFlier.fly() // legal 
+0

내 책에서 가져온 예 : http://www.apeth.com/swiftBook/ch04.html#_protocols – matt