programing

Swift3에서 fileprivate와 private를 구별하는 좋은 예는 무엇입니까?

javajsp 2023. 4. 9. 20:59

Swift3에서 fileprivate와 private를 구별하는 좋은 예는 무엇입니까?

문서는 의 새로운 액세스 지정자를 이해하는 데 도움이 됩니다.Swift 3. '다보다'의 다른 를 몇 들수 있습니다fileprivate ★★★★★★★★★★★★★★★★★」private

건 - 안 거 아니에요?사용하고 있지 않습니다.fileprivate, 이 파일 내에서만 사용되는 함수는 " "를 사용하는 것과 .private

fileprivate '이젠'이 되는 거야private이전 Swift 릴리스에서는 동일한 소스 파일에서 액세스할 수 있습니다.「 」라고 private이제 선언된 어휘 범위 내에서만 액세스할 수 있습니다. ★★★★★★★★★★★★★★★★★.private 제한적이다fileprivate.

Swift 4에서는 확장자가 동일한 소스 파일에 정의되어 있는 경우 유형 내의 개인 선언에 동일한 유형의 확장자에 액세스할 수 있습니다.

예(모두 하나의 소스 파일로):

class A {
    private func foo() {}
    fileprivate func bar() {}

    func baz() {
        foo()
        bar()
    }
}

extension A {
    func test() {
        foo() // Swift 3: error: use of unresolved identifier 'foo'
              // Swift 4: no error because extension is in same source file
        bar()
    }
}

let a = A()
a.foo() // error: 'foo' is inaccessible due to 'private' protection level
a.bar()
  • ★★★foo는 「접근할 수 없다」의 할 수 .class A { ... }의 it 도 할 수 의 변경에 의 두 ).확장자에서 유형으로 액세스할 수도 없습니다(Swift 3에서 Swift 4의 변경 사항은 아래 두 번째 참고 참조).

  • "-"bar메서드는 동일한 소스 파일에서 액세스할 수 있습니다.

주의:

  1. 제안서 SE-0159 – Private Access Levels 수정은 Swift 4의 Swift 2 시멘틱스로 되돌릴 것을 제안했습니다.빠르게 진화하는 메일링 리스트에 대한 길고 논란이 많은 논의 끝에, 그 제안은 거부되었다.

  2. 제안 SE-0169 개인 선언과 확장 간의 상호 작용 개선은 다음을 제안합니다.private확장자가 동일한 소스 파일에 정의되어 있는 경우 동일한 유형의 확장자에 액세스할 수 있는 유형 내의 선언입니다.이 제안은 Swift 4에서 받아들여지고 구현되었습니다.

프라이빗, 파일프라이빗, 오픈 퍼블릭에 대한 도표를 그릴 뿐입니다.

텍스트에 대한 설명은 마틴 R의 답변을 참조하십시오.

[Swift 4, 5 업데이트]

여기에 이미지 설명 입력

Swift 5용으로 갱신

개인 vs 파일 개인

알기 쉽게 하기 위해 코드 스니펫을 Playground에 붙여넣습니다.

class Sum1 {
    let a: Int!
    let b: Int!
    private var result: Int?
    fileprivate var resultt: Int?

    init(a : Int, b: Int) {
        self.a = a
        self.b = b
    }

    func sum(){
        result = a + b
        print(result as! Int)
    }
}

let aObj = Sum1.init(a: 10, b: 20)
aObj.sum()
aObj.resultt //File Private Accessible as inside same swift file
aObj.result //Private varaible will not be accessible outside its definition except extensions

extension Sum1{

    func testing() {

        // Both private and fileprivate accessible in extensions
        print(result)
        print(resultt)
    }
}

//If SUM2 class is created in same file as Sum1 ---
class Sum2{

    func test(){

        let aSum1 = Sum1.init(a: 2, b: 2)
        // Only file private accessible
        aSum1.resultt

    }
}

주의: Swift 파일 외부에서는 개인 파일과 파일 개인 파일 모두에 액세스할 수 없습니다.

실제 경험적 규칙은 클래스/구조의 선언 내에서만 사용되는 변수, 상수, 내부 구조 및 클래스에 대해 비공개를 사용하는 것입니다.파일프라이빗은 클래스/구조와 같은 파일 내에서 사용되는 파일 내에서 정의되는 곱슬머리 괄호(즉, 어휘 범위)의 바깥쪽에 사용되는 파일에 사용합니다.

    class ViewController: UIViewController {
        @IBOutlet var tableView: UITableView!
        //This is not used outside of class Viewcontroller
        private var titleText = "Demo"
        //This gets used in the extension
        fileprivate var list = [String]()
        override func viewDidLoad() {
            navigationItem.title = titleText
        }
    }

    extension ViewController: UITableViewDataSource {
        func numberOfSections(in tableView: UITableView) -> Int {
            return list.count
        }
    }

Swift 4.0에서 Private는 이제 확장자로 액세스할 수 있지만 동일한 파일 내에서 액세스할 수 있습니다.다른 파일에서 확장자를 선언/정의하면 개인 변수는 확장자에 액세스할 수 없습니다**

Private (파일프라이빗)
파일-프라이빗 액세스는 엔티티의 사용을 자신의 정의 소스 파일로 제한합니다.파일-프라이빗 액세스를 사용하면 특정 기능의 구현 세부 정보가 파일 전체에서 사용되는 경우 해당 세부 정보를 숨길 수 있습니다.
문:: fileprivate <var type> <variable name>
§: fileprivate class SomeFilePrivateClass {}



개인 액세스는 엔티티의 사용을 동봉된 선언 및 동일한 파일에 있는 선언의 확장자로 제한합니다.특정 기능의 구현 세부 정보가 단일 선언 내에서만 사용되는 경우 이러한 세부 정보를 숨기려면 개인 액세스를 사용합니다.
문:: private <var type> <variable name>
§: private class SomePrivateClass {}


모든 액세스 레벨에 대한 자세한 내용은 다음과 같습니다.Swift - Access Levels

이치노
파일: ViewController.swift
에서는 확장 와 뷰 가 모두 같은 에 개인 변수 「」가 있습니다.testPrivateAccessLevel 할 수 있습니다.

여기에 이미지 설명 입력


파일: Test File.swift
에서는 확장 와 뷰 다른 개인 변수인 기기른른른른른른른른른른른른른른 here here here here here here here here here here here here here here here here here here here here here here 。testPrivateAccessLevel는 내선번호로 액세스 할 수 없습니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력


서 클래스 ★★★★★★ViewController2는 의 입니다.ViewController 변수는 다음과 같습니다.testPrivateAccessLevel는 서브클래스에서는 액세스 할 수 없지만 파일프라이빗은 서브클래스에서는 액세스 할 수 있습니다.

여기에 이미지 설명 입력

@MartinR과 @StephenChen의 답변은 완벽하지만, Swift 4는 상황을 조금 변화시킨다.

Private는 이제 선언된 클래스 및 해당 내선번호에 대해 비공개로 간주됩니다.

FilePrivate는 변수가 정의된 클래스, 확장자 또는 동일한 파일에 정의된 다른 클래스에 관계없이 해당 파일에서 비공개로 간주됩니다.

filePrivate - 접근컨트롤 레벨이 파일 내에 있습니다.

케이스 1: 같은 클래스 파일로 확장자를 만들고 확장자로 fileprivate 함수 또는 fileprivate 속성에 액세스하려고 하면 접근이 허용됩니다.
케이스 2: 새로운 파일에 클래스 확장자를 만들고 file private 함수 또는 file private 속성에 액세스하려고 하면 액세스가 허용되지 않습니다.

개인 - 접근통제 수준은 사전적 범위에 있습니다.

케이스 1: 속성 또는 함수가 클래스에서 비공개로 선언된 경우, 범위는 기본적으로 클래스가 됩니다.케이스 2: private instance가 function body로 선언된 경우 instance 범위는 function body로 제한됩니다.

이것이 swift 4에 대한 설명입니다.swift 3의 경우 프라이빗이 다릅니다.swift 3 private에는 내선번호로 액세스할 수 없습니다.클래스 A 자체만 액세스할 수 있습니다.

여기에 이미지 설명 입력 swift 4 이후 fileprivate는 보통 같은 파일에 서브클래스를 정의하지 않기 때문에 약간 장황해집니다.대부분의 경우 프라이빗이면 충분합니다.

다음 예제에서는 에 의해 변경된 언어구조를 보여 줍니다.private ★★★★★★★★★★★★★★★★★」fileprivate을 사용하다

fileprivate func fact(_ n: Int) -> Int {
    if (n == 0) {
        return 1
    } else {
        return n * fact(n - 1)
    }
}

private func gauss(_ n: Int) -> Int {
    if (n == 0) {
        return 0
    } else {
        return n + gauss(n - 1)
    }
}

print(fact(0))
print(fact(5))
print(fact(3))

print(gauss(10))
print(gauss(9))

이건 직관에 따른 것 같아요.하지만 예외는 없나요?

안부의 말,

class Privacy {

    fileprivate(set) var pu:Int {
        get {
            return self.pr
        }
        set {
            self.pr = newValue
        }
    }
    private var pr:Int = 0
    fileprivate var fp:Int = 0


    func ex() {
        print("\(self.pu) == \(self.pr) and not \(self.fp)")
    }
}


extension Privacy {

    func ex2() {
        self.pu = 5
        self.ex()
    }

}

나는 이것이 ivars에게 매우 간단하기 때문에 이것을 좋아한다.

private 파일을 private로(또는 그 반대로) 변경하여 컴파일 시 어떻게 되는지 확인합니다.

언급URL : https://stackoverflow.com/questions/39027250/what-is-a-good-example-to-differentiate-between-fileprivate-and-private-in-swift