2016-08-16 6 views
1

나는스위프트 사용 프로토콜 확장 기본값

protocol ErrorContent { 
    var descriptionLabelText: String { get set } 
} 
extension ErrorContent { 
    var descriptionLabelText: String { return "Hi" } 
} 
struct LoginErrorContent: ErrorContent { 
    var descriptionLabelText: String 
    init(error: ApiError) { 
    ... 
    } 
} 

을 가지고 엑스 코드는 불평한다 "저장된 모든 속성을 초기화하지 않고 초기화에서 돌려줍니다." 여기서 원하는 것은 프로토콜 확장에서 descriptionLabelText에 부여한 기본값을 사용하는 것입니다. 프로토콜 확장의 요점이 아닌가? 어쨌든 이것이 왜 잘못되었는지, 그리고 내 기본값을 사용하기 위해 할 수있는 일을 이해하고 싶습니다.

답변

2

거의 정확한, 코드에 문제가 단지 몇 : 당신은 구현이 ErrorContent 확장 이미로, LoginErrorContent에서 변수를 선언 할 필요가 없습니다

  1. . 다시 선언하면 descriptionLabelText의 확장 계산 된 속성을 사용하려는 경우에만 값을 반환, 당신은, 그것이 세터로 지정 할 수없는 확장 구현을

  2. 우선합니다.

예 :

protocol ErrorContent { 
    var descriptionLabelText: String { get } 
} 

extension ErrorContent { 
    var descriptionLabelText: String { return "Hi" } 
} 

struct LoginErrorContent: ErrorContent { 

    // Overriding the extension behaviour 
    var descriptionLabelText: String { return "Hello" } 

    init(error: ApiError) { 
     ... 
    } 
} 
+0

감사합니다. descriptionLabelText를 조건부로 재정의하려면 어떻게해야합니까? – natecraft1

+0

확장의 구현을 재정의하는 방법을 보여주기 위해 예제를 편집했습니다. 다른 반환 값을 사용하여 구조체에 동일한 구현을 추가했습니다. – Yasir

+0

조건부로 재정의 할 수있는 방법이 있습니까? @Yasir – natecraft1

관련 문제