private, public, fileprivate 이렇게 3가지 정도가 기억납니다...
4가지 레벨 존재
open, public
어디서나 사용 가능
open이 더 높은 개념
open은 클래스와 클래스 멤버에만 적용 가능하고, 외부에서 서브클래싱 및 오버라이드가 가능해 그에 따른 영향을 고려해야 함
internal
모듈 안에서는 어디서든 사용가능하지만, 외부에서는 사용 불가능
앱이나 프레임워크 내부 설계를 정의할 때 보통 사용
디폴트
file-private
정의된 파일 내에서만 사용가능
private
가장 높은 제한
선언된 곳에서만 사용 가능
public class SomePublicClass {}
internal class SomeInternalClass {}
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}
public var somePublicVariable = 0
internal let someInternalConstant = 0
fileprivate func someFilePrivateFunction() {}
private func somePrivateFunction() {}
public class SomePublicClass { // explicitly public class
public var somePublicProperty = 0 // explicitly public class member
var someInternalProperty = 0 // **implicitly internal class member**
fileprivate func someFilePrivateMethod() {} // explicitly file-private class member
private func somePrivateMethod() {} // explicitly private class member
}
class SomeInternalClass { // implicitly internal class
var someInternalProperty = 0 // implicitly internal class member
fileprivate func someFilePrivateMethod() {} // explicitly file-private class member
private func somePrivateMethod() {} // explicitly private class member
}
fileprivate class SomeFilePrivateClass { // explicitly file-private class
func someFilePrivateMethod() {} // implicitly file-private class member
private func somePrivateMethod() {} // explicitly private class member
}
private class SomePrivateClass { // explicitly private class
func somePrivateMethod() {} // implicitly private class member
}
튜플은 요소 중 가장 낮은 레벨(제한이 높은 레벨)을 따라감
setter를 위한 접근 제어자도 있음
fileprivate(set)
private(set)
internal(set)
struct TrackedString {
private(set) var numberOfEdits = 0
// 아래의 경우는 getter까지 명시적으로 접근 제어자를 설정한 경우
// public private(set) var numberOfEdits = 0
var value: String = "" {
didSet {
numberOfEdits += 1
}
}
}
Swift ) Access Control(접근 제어) - (1)