값 타입 (value type) 은 변수 또는 상수에 할당될 때나 함수에 전달될 때 복사 되는 값인 타입이다.
실제로 값 타입에 대해 이전 챕터에서 광범위하게 다뤘다. 실제로 Swift에서 정수, 부동 소수점, 부울, 문자열, 배열 그리고 딕셔너리와 같은 기본 타입의 모두는 값 타입이고 구조체로 구현되어 있다.
Swift에서 모든 구조체와 열거형은 값 타입이다. 이것은 생성한 구조체와 열거형 인스턴스와 프로퍼티로 포함된 모든 값 타입은 코드에서 전달될 때 복사된다는 의미이다.
Note
배열, 딕셔너리, 문자열과 같은 Swift 표준 라이브러리에 정의된 콜렉션은 최적화를 사용하여 복사 성능 비용을 줄인다. 즉시 복사본을 만드는 대신에 이러한 콜렉션은 원본 인스턴스와 복사본 간에 요소가 저장된 메모리를 공유한니다. 콜렉션의 복사본 중 하나가 수정되면 요소는 수정되기 직전에 복사된다. 코드에서 보이는 동작은 항상 바로 복사가 일어나는 것처럼 보인다.
이전 예제에서 Resolution 구조체를 사용하는 다음 예제를 살펴보자.
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
이 예제는 hd라는 상수를 선언하고 풀 HD 비디오의 너비와 높이를 초기화하는 Resolution 인스턴스를 설정한다.
그리고 나서 cinema라는 변수를 선언하고 hd의 현재 값을 설정한다. Resolution은 구조체이므로 기존 인스턵ㄴ스의 복사본이 만들어지고 이 새 복사본에 cinema가 할당된다. hd와 cinema가 현재 같은 너비와 높이를 가지지만 2개는 완벽하게 다른 인스턴스이다.
다음으로 cinema의 width 프로퍼티를 디지털 시네마 프로젝션에 사용되는 약간 더 넓은 2k 표준으로 수정된다.
cinema.width = 2048
cinema 의 width 프로퍼티를 체크하면 2048 로 바뀐 것을 확인할 수 있다:
print("hd is still \(hd.width) pixels wide")
// Prints "hd is still 1920 pixels wide"
cinema 에 hd 에 현재값이 주어졌을 때 hd 에 저장된 값은 새로운 cinema 인스턴스에 복사된다. 마지막 결과는 숫자값을 포함한 2개의 완벽히 분리된 인스턴스 입니다. 그러나 분리된 인스턴스이기 때문에 아래의 그림과 같이 cinema 에 너비를 2048 로 설정해도 hd 에 저장된 너비에는 영향을 주지 않는다:

열거형에서도 같은 동작이 이뤄진다:
enum CompassPoint {
case north, south, east, west
mutating func turnNorth() {
self = .north
}
}
var currentDirection = CompassPoint.west
let rememberedDirection = currentDirection
currentDirection.turnNorth()
print("The current direction is \(currentDirection)")
print("The remembered direction is \(rememberedDirection)")
// Prints "The current direction is north"
// Prints "The remembered direction is west"
rememberedDirection 은 currentDirection 에 값이 할당될 때 실질적으로 복사본이 설정된다. 이후에 currentDirection 에 값을 변경해도 rememberedDirection 에 저장된 원래 값의 복사본에는 영향을 주지 않는다.