기본 매개 변수가있는 정적 메서드가있는 프로토콜이 있습니다. 프로토콜을 구현하는 클래스에서 기본값을 변경하려고합니다. 본질적으로 클래스와 슈퍼로 쉽게 수행 할 수 있습니다.
프로토콜에 연결된 유형이없는 경우에만 해결책을 얻을 수 있습니다.프로토콜에 연결된 형식이있을 때 일반 메서드에서 프로토콜을 기본 구현으로 호출
다음 코드는 작동하지만 관련 유형 선언의 주석을 해제하면 바로 컴파일되지 않습니다. 이 컴파일되지 않는 이유
protocol Protocol {
// associatedtype AssociatedType
}
extension Protocol {
func sayHello(name: String = "World") {
print("Hello, \(name)!")
}
}
class Class<T>: Protocol {
typealias AssociatedType = T
func sayHello(name: String = "Stack Overflow") {
// Uncommenting the Protocol.AssociatedType causes:
// Protocol can only be used as a generic constraint because it has associated type requirements
(self as Protocol).sayHello(name)
}
}
Class<()>().sayHello()
나는 이해한다 : Protocol
는 AssociatedType
에 대한 구체적인 유형이 없습니다.
어쩌면 질문은 "내가 프로토콜을 명시 적으로 전문화 할 수 있습니까?"라고 대답해야합니다. 그 대답은 "아니오"입니다.
부분적인 해결책이 있습니다. 그러나 그것이 효과가 있더라도, 그것은 빤다.
특히 내가 sayHello
이 공개 된 라이브러리를 작성 중이므로 다음 해결 방법을 사용하면 두 번째 프로토콜이 공개되어야하지만 쓸모가 없습니다. 내 sayHello
연관된 유형을 사용하기 때문에,
protocol Parent {}
protocol Protocol: Parent {
associatedtype AssociatedType
}
extension Parent {
func sayHello(name: String = "World") {
print("Hello, \(name)!")
}
}
class Class<T>: Protocol {
typealias AssociatedType = T
func sayHello(name: String = "Stack Overflow") {
(self as Parent).sayHello(name)
}
}
Class<()>().sayHello()
그러나 이것은 나를 위해 작동하지 않습니다
여기에 해결 방법입니다. 따라서 다른 프로토콜로 추출 할 수 없습니다.
그냥 내가 분명 해요 확인하기 위해 여기 난 단지 프로토콜의 클래스를 대체하고 싶은 내용은 다음과 같습니다
class Protocol<T> {
func sayHello(name: String = "World") {
print("Hello, \(name)!")
}
}
class Class<T>: Protocol<T> {
override func sayHello(name: String = "Stack Overflow") {
super.sayHello(name)
}
}
Class<()>().sayHello()
필자가 지적했듯이 내가 피하려고하는 공개 API를 오염시키기 때문에이 대답을 받아들이지 않습니다. 그것은 나에게 영감을 주었고, 그래서 나는 내 자신의 대답을 게시했다. – ThinkChaos