가짜 시나리오 :Swift 프로토콜 확장을 사용하여 개인 속성을 수정할 수있는 공유 코드를 만드는 방법은 무엇입니까?
클래스가 있습니다 : ClassA
; 및 ClassB
. 둘 다 이라는 단일 요구 사항을 포함하는 ProtocolC
을 구현합니다. ProtocolC
은 및 ClassB
이 요구하는 기능이 동일하기 때문에 createKey()
을 구현하는 extension
을 가지고 있습니다. 그러나 createKey()
의 구현은 이라는 개인 변수에 액세스해야합니다. 이는 ClassA
과 ClassB
이 모두 포함되어 있으며 두 클래스에서 서로 다른 값을 가져야합니다 (상상해보십시오). 변수가 fileprivate
이기 때문에 extension
이 createKey()
인 경우 ProtocolC
이됩니다. 이는 해당 코드가 ClassA
및 ClassB
모두에 복제되어야 함을 의미하기 때문에 유용하지 않습니다. 그러나 중복 된 코드는 프로그래밍의 no-no입니다. 프록시 은 프로토콜 확장이 아닌 수퍼 클래스를 사용하는 일 수 있지만 스위프트가 달성하려고 시도하는 것과는 다른 결과를 가져옵니다. 상속은 신속한 아니오입니다.
// the ideal:
class ClassA: ProtocolC {
fileprivate var uniqueKey: String?
}
class ClassB: ProtocolC {
fileprivate var uniqueKey: String?
}
protocol ProtocolC {
func createKey()
}
extension ProtocolC {
func createKey(){
uniqueKey = NSUUID().uuidString
}
}
// the reality:
class ClassA: ProtocolC {
fileprivate var uniqueKey: String?
func createKey(){
uniqueKey = NSUUID().uuidString
}
}
class ClassB: ProtocolC {
fileprivate var uniqueKey: String?
func createKey(){
uniqueKey = NSUUID().uuidString
}
}
uniqueKey
읽어 주셔서 감사합니다.
제안 사항이 없습니다. 나는 다음과 같이 줄 것이다 : 중복 된 코드; 또는 상속을 사용합니까? 그것은 실패한 것 같은 느낌입니다. –
이 질문은 탐구/학습을위한 것이지만, 실용적인 방법으로이 예제를 해결하기 위해서는'fileprivate var uniqueKey : String? = NSUUID() .uuidString' 두 파일 사이. – Connor
나는 결국 @ 코 너를했다. 내가 실패한 것처럼 느껴졌고 가장 좋지 않은 방법으로 해결책을 찾았습니다. 여전히 그렇습니다. 하지만 ... 정확히 무엇을해야합니까? 나는 모른다. –