2017-04-07 8 views
2

나는 fileprivate 액세스 수준 한정자가 그것이 선언 된 소스 파일에 함수/속성을 사용하여 제한되고 private - 선언 된 어휘 범위에만 제한된다는 것을 알고 있습니다. 그러나이 규칙은 확장에 적용되지 않는 것으로 보입니다. E.G. 이 코드는 유효합니다 :fileprivate와 개인 확장의 차이점은 무엇입니까?

class Foo { 
} 

fileprivate extension Foo { 
    var aa: Int { 
     return aaa + 10 
    } 
} 

private extension Foo { 
    var aaa: Int { 
     return 20 
    } 
} 

다른 이들 사이의 차이점을 알 수 있습니까? 감사.

+0

흠 ... 내가 확장의 범위가 파일이기 때문입니다 경우 궁금해? vars를 확장자 대신 파일 개인 및 비공개 파일로 선언 한 경우에는 작동하지 않습니다. – Fogmeister

+0

@ Fogmeister 맞아요. 변수에 접근 수정자를 추가하면, 작동하지 않습니다. 아마도 개인 확장이 의미가 없기 때문에 애플이 그랬을 것입니다. 개인 확장으로 선언 된 모든 것이 거기에서만 보일 수 있습니다. –

+0

관련 항목 : http://stackoverflow.com/questions/39739813/private-vs-fileprivate-on-declaring-global-variables-consts-in-swift3, http://stackoverflow.com/questions/43054774/distinction-between -private-and-fileprivate-top-level-classes. –

답변

1

유형 구성원에 대해 이야기 할 때 차이점 만 나타납니다. private은 동일한 유형 정의 내의 다른 메소드에 대한 액세스를 제한하며 fileprivate 파일은 동일한 .swift 파일에있는 항목으로 액세스 할 수 있습니다.

최상위 수준 (형식 정의 외부)에있는 내용의 경우 privatefileprivate은 정확히 동일하게을 수행합니다. 당신이

fileprivate extension Foo 
{ 
    var aa: Int 
    { 
     return aaa + 10 
    } 
} 

private extension Foo 
{ 
    var aaa: Int 
    { 
     return 20 
    } 
} 

을 쓸 때 그래서 당신은 정말 궁극적으로, 같은 프로토콜에있는 두 개의 확장은 하나의 확장으로 컴파일러에 의해 해결 얻을

fileprivate extension Foo 
{ 
    var aa: Int 
    { 
     return aaa + 10 
    } 
} 

fileprivate extension Foo 
{ 
    var aaa: Int 
    { 
     return 20 
    } 
} 

을 썼다.

fileprivate extension Foo 
{ 
    var aa: Int 
    { 
     return aaa + 10 
    } 
    var aaa: Int 
    { 
     return 20 
    } 
} 

두 개의 키워드이 retarded처럼, 어떤 스위프트 건축가 agree with you을 가지고 생각 생각합니다. 일부 스타일 가이드는 publicprivate 액세스 한정자 (물론 internal 수정 자도 있지만 기본적으로 하나만 사용)를 사용하는 것이 좋습니다. 일반적으로 파일 단위로 제한하므로 - 단위 또는 per-type 기초는 특히 ​​유용하지 않다.

fileprivate 수정자를 사용해야하는 경우 private 수정자를 유형 범위 외부에서 사용하지 마십시오. 이 문맥에서 private이 실제로 "fileprivate"을 의미하므로 혼동스럽고 코드를 읽기가 더 어렵게 만듭니다.

+0

나는 당신이 의미하는 바를 이해하는지 모르겠습니다. "차이점은 우리가 유형의 멤버에 대해 말할 때만 나타납니다." 또한 실제 질문에 어떻게 대처했는지는 확실하지 않지만 다른 시나리오를 제시하지 않았습니까? – Honey

+0

@Honey 확장은 형식 멤버가 아니며 최상위 수준에서 선언됩니다. 그래서'private' 수정자는 실제로'fileprivate' 수정자가 철자가 다른 이유입니다. –

0

스위프트 4.0에서는 privatefileprivate의 범위가 확장됩니다.
이제 실제 클래스/확장자 외부의 동일한 파일에서 비공개로 액세스 할 수 있습니다. 당신이 선언하면/다른 파일에 확장을 정의, 당신의 개인 변수는


파일 개인
파일 - 개인 액세스 엔티티의 사용을 제한 작동 할 시간 fileprivate에 액세스 할 수 없습니다 자체 소스 파일을 정의합니다. 파일 개인 액세스를 사용하면 해당 세부 정보가 전체 파일 내에서 사용될 때 특정 기능의 구현 세부 정보를 숨길 수 있습니다.
구문 :fileprivate <var type> <variable name>
예 : 개인
개인 액세스은 포함 선언 엔티티의 사용을 제한
fileprivate class SomeFilePrivateClass {}


, 같은에 그 선언의 확장에 파일. 단일 선언 내에서만 세부 사항이 사용되는 경우 개인 액세스를 사용하여 특정 기능의 구현 세부 사항을 숨 깁니다.
구문 :private <var type> <variable name>
예 : 다음 private class SomePrivateClass {}


모든 액세스 수준에 대한 자세한 내용 : Swift - Access Levels