확장(extension)에 정의되지 않은 setter

확장(extension)에 정의되지 않은 setter

이 진단은 확장 오버라이드(extension override)나 정적(static) setter를 호출했는데, 지정한 확장이 그 setter를 정의하지 않았을 때 analyzer가 만들어 내는 진단이에요. setter 이름을 어떻게 고쳐야 하는지 예시와 함께 차근차근 살펴볼게요.

출처: undefined_extension_setter

본문

The setter '{0}' isn't defined for the extension '{1}'. — 확장 {1}에 setter {0}이 정의되어 있지 않다는 뜻이에요.

설명 (Description)

이 진단은 확장 오버라이드(extension override)를 사용해 setter를 호출했는데, 지정한 확장이 그 setter를 정의하지 않았을 때 발생해요. 또 정적(static) setter를 참조했는데 지정한 확장이 그 setter를 정의하지 않았을 때도 이 진단이 발생해요.

예시 (Example)

다음 코드는 확장 Eb라는 인스턴스(instance) setter를 선언하지 않았기 때문에 이 진단이 발생해요.

extension E on String {
  set a(String v) {}
}

extension F on String {
  set b(String v) {}
}

void f() {
  E('c').b = 'd';
}

다음 코드는 확장 Ea라는 정적(static) setter를 선언하지 않았기 때문에 이 진단이 발생해요.

extension E on String {}

void f() {
  E.a = 3;
}

해결 방법 (Common fixes)

setter의 이름이 잘못되었다면, 기존에 존재하는 setter의 이름으로 바꾸면 돼요.

extension E on String {
  set a(String v) {}
}

extension F on String {
  set b(String v) {}
}

void f() {
  E('c').a = 'd';
}

setter의 이름은 맞는데 확장의 이름이 잘못되었다면, 확장의 이름을 올바른 이름으로 바꾸면 돼요.

extension E on String {
  set a(String v) {}
}

extension F on String {
  set b(String v) {}
}

void f() {
  F('c').b = 'd';
}

setter와 확장의 이름이 모두 맞는데 setter가 정의되어 있지 않다면, setter를 직접 정의해 주면 돼요.

extension E on String {
  set a(String v) {}
  set b(String v) {}
}

extension F on String {
  set b(String v) {}
}

void f() {
  E('c').b = 'd';
}

더 알아보기