액세스 제어 개념을 통해 다른 코드에서 유형,함수 및 기타 선언에 액세스 할 수있는 방법을 제한 할 수 있습니다. 스위프트는 액세스 제어의 다섯 가지 수준을 제공하고,이들의 전체를 사용하는 것은 명확하게 분리 우려와 강력한 구조를 가지고 프로그램을 작성하기 위해 중요 할 수 있습니다.

스위프트에서 새로운 유형,속성 또는 함수를 정의하면 기본적으로internal액세스 수준이 됩니다. 즉,앱,시스템 확장 프로그램,프레임워크 또는 스위프트 패키지와 같이 동일한 모듈 내에 있는 다른 모든 코드에 표시됩니다.

예를 들어,쇼핑 앱을 빌드하고 있으며 제품 배열의 총 가격을 계산할 수 있는PriceCalculator클래스를 정의했다고 가정해 보겠습니다.

현재 명시적 액세스 수준을 지정하지 않고 있으므로PriceCalculator클래스(및calculatePrice메서드)는 앱 내 어디에서나 액세스할 수 있습니다. 그러나 새로운 클래스를 다른 모듈과 공유하려는 경우(예:기본 앱과 확장 프로그램 또는 컴패니언 애플 시계 앱 사이에서 공유하는 프레임 워크 내에서 구현할 수 있음),외부 컨텍스트 내에서 볼 수 있도록public만들어야 합니다.

그러나 위의 변경 사항으로는 충분하지 않습니다. 우리가 지금 정의 된 모듈 외부에서 클래스를 찾을 수있는 동안,우리는 그것의 인스턴스를 만들 수 없습니다—그(암시 적)이니셜 라이저는 다른 코드와 마찬가지로 기본적으로internal이기 때문에. 이 문제를 해결하기 위해public이니셜 라이저를 정의 해 보겠습니다.이 이니셜 라이저는 그 안에 실제 작업이 없기 때문에 비워 둘 것입니다:

public class PriceCalculator { public init() {} ...}

우리는 이제 모듈 내부와 외부 모두에서PriceCalculator을 찾고 초기화하고 호출 할 수 있습니다. 그러나 이제 우리가 그것을 수정하거나 새로운 기능을 추가하기 위해 그것을 서브 클래스하려고한다고 가정 해 봅시다. 그것이 현재 자체 모듈 내에서 가능하지만,그것은 다시 그 밖에서 방지되는 것입니다.

이를 변경하려면 스위프트의 현재 가장 개방적인 액세스 제어 수준을 사용해야 합니다.open:

open class PriceCalculator { ...}

위의 변경 사항을 적용하면 이제 어디서나PriceCalculator의 사용자 정의 하위 클래스를 만들 수 있습니다.이 클래스는 새로운 이니셜 라이저,새로운 속성 및 새로운 메소드를 가질 수 있습니다. 이를 사용하여DiscountedPriceCalculator을 구현하면 주어진discount를 모든 가격 계산에 적용 할 수 있습니다:

위에서 우리는 새로운 가격 계산 방법을 정의하고 있지만,대신 기본 클래스에서 상속 한 기존calculatePrice방법을 재정의하고 수정하는 것이 훨씬 더 적절할 것입니다. 그렇게하면 호출 할 메소드에 혼란이 없으며 두 클래스를 일관되게 유지할 수 있습니다.

그렇게 할 수 있으려면 원래 선언(이번에는calculatePrice메소드 선언)을 다시 표시해야합니다open:

open class PriceCalculator { public init() {} open func calculatePrice(for products: ) -> Int { ... }}

위의 방법으로 이제 별도의 메서드를 만드는 대신calculatePrice를 자유롭게 재정의할 수 있습니다:

그래서internal,publicopen—공공 사용 및 수정을 위해 점차적으로 선언을 여는 데 사용됩니다. 그러나 우리는 물론 다른 방법으로 갈 수 있으며 코드의 일부가 발견되고 사용되지 않도록 숨길 수 있습니다. 처음에는 그 일에 어떤 가치가 있는지 의심스러워 보일 수 있지만,실제로 우리의 아피 아피를 훨씬 더 좁고 집중하게 만드는 데 도움이 될 수 있으며,이를 통해 이해,테스트 및 사용이 더 쉬워 질 수 있습니다.

이제 액세스 레벨 스펙트럼의 반대편으로 가서 가장 제한적인 레벨 인private을 살펴 보겠습니다. private로 표시된 모든 형식,속성 또는 메서드는 자체 형식(동일한 파일 내에 정의된 형식의 확장명도 포함)내에서만 표시됩니다.

주어진 유형의 개인 구현 세부 사항으로 간주되어야하는 것은 틀림없이private로 표시되어야합니다. 예를 들어,우리의 가격 계산기의discount속성 전에 정말만 그것의 자신의 클래스 내에서 사용 되는 의미 했다-그래서 서 하 고 그 속성을 비공개로:

class DiscountedPriceCalculator: PriceCalculator { private let discount: Int ...}

이전 구현은discountDiscountedPriceCalculator클래스 내에서 완전히 볼 수 있기 때문에 이전과 동일한 방식으로 계속 작동합니다. 그러나 동일한 파일 내에 정의 된 다른 형식도 포함하도록 가시성을 약간 확장하려는 경우fileprivate을 사용해야합니다.이 형식은 정확히 어떤 소리인지 정확히 수행하며 정의 된 파일 내에서 선언을 비공개로 유지합니다:

class DiscountedPriceCalculator: PriceCalculator { fileprivate let discount: Int ...}

위의 변경 사항이 적용되면 동일한 파일에 정의된 관련 코드에서discount속성에 액세스할 수 있습니다. 형식 내에서 정의 된 선언에 적용 할 때만 다릅니다.

그래서,요약하면,이 스위프트는 현재 제공하는 액세스 제어의 다섯 가지 수준입니다:

  • private 동일한 파일 내에 정의된 해당 형식의 확장을 포함하여 해당 바깥쪽 형식 내에서 속성 또는 함수를 비공개로 유지합니다. 최상위 유형,함수 또는 확장에 적용하면fileprivate과 같은 방식으로 작동합니다.
  • fileprivate은 정의된 전체 파일 내에서 선언을 표시하고 다른 모든 코드에서 선언을 숨깁니다.
  • internal은 기본 액세스 수준이며 정의된 전체 모듈 내에서 선언을 표시합니다.
  • public는 모듈 외부의 함수,유형,확장 또는 속성을 나타냅니다.
  • open클래스를 서브클래스하고 해당 모듈 외부에서 함수나 속성을 재정의할 수 있습니다.

일반적으로 주어진 선언이 실제로 가질 수있는 가장 제한적인 액세스 수준으로 시작한 다음 나중에 필요한 경우 열어 보는 것이 가장 좋습니다. 그런 식으로 우리는 우리의 다양한 유형과 기능 사이의 상호 작용을위한 길을 제한하고,처음에는 나쁜 것처럼 보일 수 있지만,유지 보수가 가능하고 잘 구조화 된 시스템을 구축하기 위해 종종 진정으로 필수적입니다.

읽어 주셔서 감사합니다! 1885>

(이 문서는private(set)와 같은 돌연변이 별 액세스 한정자에 포함되지 않았습니다. 그들은 다른 기초 기사에의해 앞으로는 충당될 것이다.)

이 스폰서를 확인하여 선델에 의해 스위프트 지원:

인스타버그는: 자세한 스택 추적,네트워크 로그 및 사용자 인터페이스 이벤트를 사용하여 버그,충돌 및 기타 문제를 훨씬 빠르게 해결할 수 있습니다. *********** 무료로 그것을 시도하고 코드의 단지 한 줄과 통합 할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다.