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
메서드는 동일한 소스 파일에서 액세스할 수 있습니다.
주의:
제안서 SE-0159 – Private Access Levels 수정은 Swift 4의 Swift 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
'programing' 카테고리의 다른 글
-performSelector:withObject:afterDelay:와 같이 지연 후에 블록을 트리거하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
---|---|
오류: "INSERT EXEC 문을 중첩할 수 없습니다." 및 "INSERT-EXEC 문 내에서 ROLLBLL 문을 사용할 수 없습니다."어떻게 해결할까요? (0) | 2023.04.09 |
대용량 엑셀 파일을 효율적으로 여는 방법 (0) | 2023.04.09 |
모든 열거값을 배열로 가져오는 방법 (0) | 2023.04.09 |
UITableView에서 자동 레이아웃을 사용하여 동적 셀 레이아웃 및 가변 열 높이 설정 (0) | 2023.04.09 |