Swift의 접근 수준(private, fileprivate, internal, public, open)은 클래스, 구조체 및 속성뿐만 아니라 중첩(nested) 타입에도 영향을 미칩니다. 중첩 타입은 명시적 제한이 지정되지 않은 경우 기본적으로 둘러싼 타입의 접근 수준을 상속받습니다.
주요 미세사항:
internal로 선언된 경우, 중첩 타입은 외부보다 더 개방적일 수는 없지만(예: 외부가 public일 경우, 중첩은 private일 수 있음) 더 폐쇄적일 수 있습니다.internal로 선언된 중첩 타입은 다른 모듈에서 보이지 않습니다.예:
public class A { public struct B { fileprivate func foo() {} } }
이 예에서 A와 B는 공개적이지만, 메서드 foo()는 파일 전용입니다.
질문: "중첩 타입이 둘러싸고 있는 타입보다 더 높은 접근 수준을 가질 수 있습니까?"
답변: 아닙니다, 중첩 타입의 접근 수준은 둘러싸고 있는 타입의 접근 수준을 초과할 수 없습니다. 더 높은 접근 수준으로 중첩 타입을 선언하려고 하면 컴파일러가 오류를 발생시킵니다.
오류 예:
internal struct MyStruct { public enum MyEnum { ... } // 오류: public은 internal 안에 있을 수 없음 }
이야기 1
일반 프레임워크에서 중첩 구조의 접근 수준이 외부 타입과 동기화되지 않았습니다. 릴리스 버전에서는 클라이언트 애플리케이션에서 내부 enum을 사용할 수 없어 인터페이스를 긴급히 수정해야 했습니다.
이야기 2
대형 프로젝트에서 내부 서비스 객체는
internal로 선언된 상태를 가진 중첩 클래스를 가지고 있었습니다. 이 클래스에 의존하는 새로운 모듈이 추가되면서 접근 수준을 높이고 SDK를 완전히 다시 컴파일하지 않고는 통합이 불가능하게 되었습니다.
이야기 3
복잡한 라이브러리에서 일부 중첩 구조가
public으로 선언되었고, 그 자체의 컨테이너는internal로 되어 있었습니다. 새로운 버전으로 마이그레이션하는 동안 치명적인 오류가 발생했습니다: 공개 타입이 외부 컨텍스트에서 컴파일되지 않아 여러 팀의 업데이트가 지연되었습니다.