독서노트:swift protocol 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의 기본 실현이든)을 실현한 것으로 확정할 수 있다. 대담하게 동적 송신기제를 사용하여 방법의 최종 실현을 찾을 수 있다.
요약:
이 문서는 독서 노트로 PROTOCOL EXTENSION 연결 옵션 인터페이스와 인터페이스 확장 참조
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.