2014-06-08 3 views
6

전체 Swift book을 읽었으며 WWDC videos (모두 내가 진심으로 추천합니다)을 보았습니다. 내가 걱정하는 한 가지는 데이터 캡슐화입니다.스위프트의 데이터 캡슐화

class Stack<T> 
{ 
    var items : T[] = [] 

    func push(newItem: T) { 
     items.insert(newItem, atIndex: 0) 
    } 

    func pop() -> T? { 
     if items.count == 0 { 
      return nil; 
     } 

     return items.removeAtIndex(0); 
    } 
} 

이 클래스는 스택을 구현하고, 어레이를 사용하여 구현한다

는 다음 (완전히 인위적인) 예를 고려한다. 문제는 items입니다 (Swift의 모든 속성과 마찬가지로) public이므로 공개 API와 별도로 직접 액세스 (또는 돌연변이) 할 수 없습니다. curmudgeonly 오래된 C++ 녀석으로서, 이것은 나를 매우 심하게 만듭니다.

나는 사람들이 액세스 수정 자의 부족에 대해 슬퍼하는 것을보고, 나는 그들이이 문제를 직접적으로 다룰 것이라는 데 동의한다. (나는 그들이 Soon ™이 구현 될 것이라는 루머를 듣는다.) 나는 데이터 은닉을위한 몇 가지 전략이 무엇인지 궁금하다. 그들의 부재에서.

내가 놓친 것이 있습니까? 아니면 단순히이 언어에서 누락 된 것입니까?

+0

가능한 복제본 : http://stackoverflow.com/q/24003918/1639670 – nathan

+0

데이터 숨기기 - 프로토콜의 실제적인 절반 방법이 있습니다. 클래스를 외부 세계에 표시하고 클래스 자체 대신 전달하려는 모든 기능 및 요소로 프로토콜을 준수하게하십시오. 내가 말했듯이 이것은 대체가 아니지만 가시성 수정자가 끝날 때까지 작동합니다. 또한 이것은 좋은 디자인 패턴입니다 - 의존성 주입 –

+0

"아무도 공용 API와 별도로 직접 액세스 (또는 돌연변이)하지 못하도록합니다."- "curmudgeonly old C++ guy"가 아닌 :-) 당신은 어떤 해를 끼치고 있습니까? 사람들이 원하는 방식으로 코드를 사용하지 못하도록 막지 않으면 어떻게 될까? 예를 들어 파이썬에는 "우리는 모두 성인입니다." 공개/비공개는 문서화 및 대회를 기반으로합니다. 누군가가 수업 내적으로 어떤 것을 피델라이하고 싶다면주의해야합니다. 아무도 내부 객체에 접근 할 충분한 이유가 없을 것이라고 모든 사람이 영원히 알 수있는 척하지 않습니다. – alcalde

답변

6

현재로서는 누락되었습니다. Greg Parker는 가시성 수정자를 올리겠다고 명시했습니다 (in this dev forums thread).

헤더가 없다는 것을 감안할 때 표준 Objective-C 트릭은 작동하지 않으며 뒤쪽으로 많은 굽힘이 필요하지 않은 가시성을 제한하는 또 다른 트릭을 생각할 수 없습니다. 언어 기능이 약속 되었기 때문에 큰 투자 가치가 있는지 확신 할 수 없습니다.

밝은 점에서이 기능이 인 경우는이 흐트러 졌으므로 지금은 file a radar의 좋은 시간이며 영향력에 영향을줍니다.

0

실은 사실상 나는 최적의 OO 속성을 가진 코드에 대한 이론을 따르기 위해 마침내 정적 타이핑을 채택한 것을 기쁘게 생각합니다. 여전히 헤더의 가을은 객체 지향 프로그래밍, 즉 캡슐화의 매우 긴장을 무너 뜨립니다. 출구는 Eiffel이 자동으로 머리말을 추출하는 것과 같지만 어느 것이 공용 인터페이스이고 어떤 것이 사적인 것인가를 지정하지 않으면 쓸데없는 것입니다. 나는 애플의 이런 움직임에 정말 분노하고있다.

4

나중에 참조 할 수 있도록 답변이 업데이트되었습니다. 애플의 documentation에서

:

액세스 수준

스위프트 코드 내에서 기관에 대한 세 가지 다른 액세스 수준을 제공합니다. 이러한 액세스 수준은 엔티티가 정의 된 소스 파일 에 상대적이며 소스 파일이 속한 모듈에 상대적입니다.

공공 액세스는 에 엔티티가 정의하는 모듈을 가져 다른 모듈에서 또한 소스 파일을 자신의 정의 모듈에서 모든 소스 파일 내에서 사용 될 수 있습니다. 프레임 워크에 공용 인터페이스 을 지정할 때 일반적으로 공용 액세스를 사용합니다.

내부 액세스은 실체가 아니라 해당 모듈의 소스 파일 외부에서, 자신의 정의 모듈에서 어떤 소스 파일 내에서 사용 할 수 있습니다. 일반적으로 앱 또는 프레임 워크의 내부 구조를 정의 할 때 내부 액세스를 사용합니다.

개인 액세스 은 자체 정의 소스 파일로 엔티티 사용을 제한합니다. 특정 기능 의 구현 세부 정보를 숨기려면 개인 액세스를 사용하십시오. 공개 액세스는 가장 높은 (가장 제한이 적은) 액세스 수준이며 개인 액세스는 가장 낮은 (또는 가장 제한적인) 액세스 수준입니다.