open
< public
< internal
< fileprivat
< private
internal
로 판단open
: 모듈 외부 접근 가능, 모든 소스 파일에서 접근 가능, 다른 모듈에서도 서브 클래싱 가능public
: 모듈 외부 접근 가능, 모든 소스 파일에서 접근 가능, 같은 모듈 내에서만 서브클래싱 가능internal
: 디폴트 접근 제어자, 외부 모듈 접근 불가능fileprivate
: 소스 파일 내부에서만 접근 가능, 같은 소스 파일의 서로 다른 클래스 접근 가능private
: 같은 파일 내부에서도 다른 클래스이면 접근 불가능구조체 Structs 와 열거형 Enum 에서 사용
메서드 Method가 속성 수정할 수 있도록 하는 키워드
// 구조체 예시
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var point = Point(x: 1.0, y: 1.0)
print("Before moving: x = \(point.x), y = \(point.y)")
point.moveBy(x: 2.0, y: 3.0)
print("After moving: x = \(point.x), y = \(point.y)")
// Before moving: x = 1.0, y = 1.0
// After moving: x = 3.0, y = 4.0
// 열거형 예시
enum TrafficLight {
case red, yellow, green
mutating func next() {
switch self {
case .red:
self = .green
case .yellow:
self = .red
case .green:
self = .yellow
}
}
}
var currentLight = TrafficLight.red
print("Current light is \(currentLight)")
currentLight.next()
print("Next light is \(currentLight)")
// Current light is red
// Next light is green
값 vlalue 캡쳐: 변수나 상수의 값 캡쳐 , 캡쳐 값 변경되어도 원본 값 변경 X
참조 reference 캡쳐: 변수나 상수의 참조 캡쳐, 캡쳐 값 변경 되면 원본 값도 변경
// 값 캡처
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var total = 0
// 클로저를 반환합니다.
let incrementer: () -> Int = {
// total 변수를 캡처하여 저장합니다.
total += amount
return total
}
return incrementer
}
let incrementByTen = makeIncrementer(forIncrement: 10)
print(incrementByTen()) // total = 10, 결과: 10
print(incrementByTen()) // total = 20, 결과: 20
```
() → Int는 함수 makeIncrementer의 타입으로,‘매개변수가 없고 정수를 반환하는 함수’를 의미한다.
프로퍼티인 let incrementer: () → Int 타입과 동일하기 때문에retrun incrementer가 가능하다!
let incrementByTen 에는 return 타입인 () → Int, 즉 함수가 들어가 있다.
print(incrementByTen()) 파라미터 없으므로 빈 () 사용해서 실행
```
// 참조 캡처
class SimpleClass {
var value: Int = 10
}
func createClosure() -> () -> Int {
let instance = SimpleClass()
// 참조 캡처를 사용하여 SimpleClass의 인스턴스를 캡처합니다.
let closure: () -> Int = {
// 클로저가 참조하는 인스턴스의 속성을 업데이트합니다.
instance.value *= 2
//let instance의 instance 캡쳐해 value에 접근한다.
return instance.value
}
return closure
}
// 클로저 생성
let myClosure = createClosure()
print(myClosure()) // 20
print(myClosure()) // 40
// 클로저 내부에서 참조된 인스턴스의 속성을 변경하였으므로 원본에도 영향을 줍니다.