독서노트:swift protocol extension

3812 단어
objc시대에 만약에 우리가 기존의 프로토콜에 방법을 추가하고 이 프로토콜의 클래스를 실현하기 위해 공유된 기능을 추가하고자 한다면 흔히 볼 수 있는 방법은 코드를 모든 프로토콜을 실현하는 클래스에 복사하는 것이다. 이것은 서투르고 유지하기 불편한 방식이다.  swift2.0protocol extension을 도입하여 기존 프로토콜에 확장을 추가하고 기본 구현을 제공합니다. 모든 프로토콜을 준수하는 실례 형식에서 우리가 아무것도 하지 않아도 기본 구현을 컴파일하고 호출할 수 있습니다.
import Foundation

protocol ExampleProtocol {
    func method()
}
extension ExampleProtocol {
    func method() {
        print("hi")
    }
}

class ExampleClass :ExampleProtocol {
}
ExampleClass().method() //print hi

  는 일상적인 개발에서 extension 프로토콜을 확장할 수 있는 곳이 있습니다.objc에서 @optional 키워드를 통해 선택할 수 있는 인터페이스 형식을 설명할 수 있습니다. 실례가 반드시 실현될 필요는 없고, swift의protocol은 모든 방법이 실현되어야 합니다.  그렇다면 swift에서 선택할 수 있는 프로토콜을 실현하려면 어떻게 해야 합니까?실행 가능한 방안은protocol을 설명할 때 키워드 @objc를 추가하고 본질적으로objc 프로토콜을 설명하며 @objc 옵션al 키워드에 맞추어 실현하는 것입니다.
import Foundation

@objc protocol ExampleProtocol {
    @objc optional func method()
}
class ExampleClass :ExampleProtocol {
    
} //build succeeded


  이렇게 성명된 프로토콜은 본질적으로objc의 프로토콜이며,class 형식의 실례만 준수할 수 있으며, swift에서struct의enum에 사용할 수 없습니다.swift 2.0에서 extension에 의존하여 더욱 우아한 방식을 제공할 수 있다.extension는 우리의 실력 유형이 아무런 실현도 쓰지 않아도 컴파일을 통해 기본 구현을 작성할 수 있습니다.
protocol ExampleProtocol {
    func optionalMethod() //  
    func necessaryMethod() //    
}
extension ExampleProtocol {
    func optionalMethod() {
        print("hi")
    }
}

class ExampleClass :ExampleProtocol {
    func necessaryMethod() {
        print("necessaryMethod")
    }
    //  extension optionalMethod       
    //                 
}

  마찬가지로,protocol에 성명을 표시하는 방법이 없고, extension에서만 기본 구현을 제공하며, 선택할 수 있는 인터페이스로 컴파일할 수 있습니다.
protocol ExampleProtocol {
    
}
extension ExampleProtocol {
    func optionalMethod() {
        print("hi")
    }
}

class ExampleClass :ExampleProtocol {
    
}
//build succeeded

  프로토콜에 성명을 표시하는 방법이 없고 extension에서 기본 구현을 제공하여 헷갈리기 쉽습니다.예를 들어 우리는 이러한 인터페이스와 확장을 정의했다.
protocol ExampleProtocol {
    //          
    func explicitMethod()
}

extension ExampleProtocol {
    //          
    func explicitMethod() {
        print("hi")
    }
    //           
    func extensionMethod() {
        print("hi")
    }
}

class ExampleClass :ExampleProtocol {
    func explicitMethod() {
        print("hello")
    }
    func extensionMethod() {
        print("hello")
    }
}

  을 호출할 때 의문이 없습니다. 두 가지 방법으로 출력한 것은 모두 Hello입니다.
let cls = ExampleClass()
cls.explicitMethod()  //hello
cls.extensionMethod() //hello

   만약에 우리가cls의 유형을 프로토콜 형식으로 강제로 바꾸면 이 출력이 무엇인지 고려합니까?
let cls = ExampleClass() as ExampleProtocol
cls.explicitMethod()  //hello
cls.extensionMethod() //hi

이 때 출력은 예상을 벗어난 것 같습니다. 씨엘의 실제 형식은 ExampleClass이고 프로토콜의 실현을 다시 썼으며, 실행할 때 extension의 기본 실행을 출력했습니다.이 문제가 발생한 이유는 extensionMethod를 표시하지 않았기 때문입니다. 이 방법은 실제적으로 선택할 수 있는 유형이 되었고 이 프로토콜을 준수하는 유형이 반드시 실현되어야 한다는 규정이 없습니다. 저희 컴파일러는 extensionMethod가 현재 유형의 실례에 의해 실현되지 않고 동적 발송 메커니즘을 사용하지 않고 컴파일러 기간에 어떤 구체적인 실현을 호출하여 안전을 확보할 수 있는지 확인합니다.방법explicitMethod에 대한 설명은protocol에 표시되어 있기 때문에 이 프로토콜을 준수하는 실례가 반드시 이 방법(이곳은 리셋 실현이든 extension의 기본 실현이든)을 실현한 것으로 확정할 수 있다. 대담하게 동적 송신기제를 사용하여 방법의 최종 실현을 찾을 수 있다.
요약:
  • extension은 기존 프로토콜에 대한 추가 방법이나 추가 방법의 기본 구현을 허용합니다.
  • swiftprotocol에서 설명을 표시하는 방법은 반드시 실현되어야 하지만 extension는 기본적으로 실현하는 방법을 제공하고 실례 형식은 표시의 구체적인 실현을 제공하지 않습니다(은시적으로 extension의 실현을 실현했습니다).
  • extension의 기본 구현은 방법을 선택할 수 있도록 할 수 있다. 즉, 실례가 최종 구현을 제공할 필요가 없다는 것이다.
  • 프로토콜에 표시된 설명이 없으면 형식 추정이 실례 형식으로 추정되면 실례의 최종 구현을 호출하고 (없으면 extension의 기본 구현을 호출합니다), 형식 추정이 프로토콜 형식으로 추정되면 extension의 기본 구현을 호출합니다.

  • 이 문서는 독서 노트로 PROTOCOL EXTENSION 연결 옵션 인터페이스와 인터페이스 확장 참조

    좋은 웹페이지 즐겨찾기