open : 모듈의 모든 소스 파일 내에서 그리고 정의 모듈을 가져오는 다른 모듈의 소스 파일에서도 엔터티를 사용
public : open과 동일하지만, 다른 모듈에서 코드를 하위 클래스로 만들고 재정의할 수 없다.
internal : 모듈의 모든 소스 파일 내에서 사용할 수 있지만 해당 모듈 외부의 소스 파일에서는 사용할 수 없다. 일반적으로 앱 또는 프레임워크의 내부 구조를 정의에 사용.
file-private : 엔터티의 사용을 자체 정의 소스 파일로 제한, 특정 기능의 구현 세부 정보가 전체 파일 내에서 사용되는 경우 이를 숨김.
private : 동일한 파일에 있는 해당 선언의 확장에 대한 엔터티 사용을 제한(내부 구현에서만 접근가능), 세부 정보가 단일 선언 내에서만 사용되는 경우 private를 사용하여 특정 기능의 구현 세부 정보를 숨긴다.
클래스, 구조체, 열거형 등에 익스텐션에서 새로운 맴버를 추가하면 새로 추가된 것은 기존에 타입이 선언된 접근레벨과 같은 레벨'
Private Members in Extensions
@propertyWrapper struct Capitalized {
var wrappedValue: String {
didSet { wrappedValue = wrappedValue.capitalized }
}
init(wrappedValue: String) {
self.wrappedValue = wrappedValue.capitalized
}
}
struct User {
@Capitalized var firstName: String
@Capitalized var lastName: String
}
// John Appleseed
var user = User(firstName: "john", lastName: "appleseed")
// John Sundell
user.lastName = "sundell"
func test() {
defer { print("end") }
print("start")
print("working...")
}
test()
// 결과
// start
// working...
// end
func test() {
defer { print("1") }
defer { print("2") }
defer { print("3") }
}
test()
// 결과
// 3
// 2
// 1