값 타입과 반대로 참조 타입 (reference types)은 변수 또는 상수에 할당될 대나 함수로 전달될 때 복사되지 앟ㄴ는다. 복사본 대신에 존재하는 같은 인스턴스에 대한 참조가 사용된다.
다음은 위에 정의된 VideoMode를 사용하는 예이다.
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
이 예제는 tenEighty라는 새로운 상수를 선언하고 VideoMode 클래스의 새로운 인스턴스를 참조하도록 설정한다.
비디오 모드는 이전에 1920 x 1080 해상도의 복사본이 할당된다. 인터레이스로 설정되고 이름을 "1080I"로 설정하고 프레임 속도를 초당 25.0 프레임으로 설정한다.
다음으로 tenEighty는 alsoTenEighty라는 새로운 상수에 할당되고 alsoTenEighty의 프레임 속도를 수정한다.
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
클래스는 참조 타입이므로 tenEighty와 alsoTenEighty는 실질적으로 같은 VideoMode 인스턴스를 참조한다.
실제로는 아래 그림과 같이 같은 하나의 인스턴스에 다른 2개의 이름을 가지고 있는 것이다.

tenEighty의 frameRate 프로퍼티를 체크하면 VideoMode 인스턴스에서 30.0의 새로운 프레임 속도가 올바르게 설정된 것을 보여 준다.
print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// Prints "The frameRate property of tenEighty is now 30.0"
이 예제는 참조 타입이 어떻게 추론하기 어려울 수 있는지 보여 준다. tenEighty 와 alsoTenEighty 가 프로그램 코드가 멀리 떨어져 있다면 비디오 모드가 변경되는 모든 방법을 찾기 어려울 수 있다. tenEighty 를 사용할 때마다 alsoTenEighty 를 사용하는 코드를 생각해야 하며 그 반대도 마찬가지이다. 반대로 값 타입은 동일한 값과 상호작용하는 모든 코드가 소스 파일에 가까이 있기 때문에 추론하기가 더 쉽다.
tenEighty 와 alsoTenEighty 는 변수가 아닌 상수 로 선언된다. 그러나 tenEighty 와 alsoTenEighty 상수 자체는 실제로 변경되지 않으므로 tenEighty.frameRate 와 alsoTenEighty.frameRate 는 여전히 변경 가능하다. tenEighty 와 alsoTenEighty 자체는 VideoMode 인스턴스를 "저장"하지 않습니다. 대신에 VideoMode 인스턴스를 둘다 참조 합니다. 변경되는 것은 VideoMode 에 대한 상수 참조의 값이 아니라 VideoMode 의 frameRate 프로퍼티이다.
클래스는 참조 타입이기 때문에 클래스의 같은 단일 인스턴스에 참조하는 여러개의 상수와 변수가 가능하다 (구조체와 열거형은 상수 또는 변수 또는 함수에 전달할 때 항상 복사되기 때문에 클래스와 같지 않다).
2개의 상수 또는 변수가 클래스의 같은 인스턴스를 참조하는지 확인하는 것이 유용할 수 있다. 이를 위해 Swift는 2가지 식별 연산자를 제공한다:
이 연산자를 사용하여 2개의 상수 또는 변수가 하나의 동일한 인스턴스를 참조하는지 확인할 수 있다:
if tenEighty === alsoTenEighty {
print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."
동일 인스턴스 (3개의 등호로 표시 또는 ===)는 같음 (equal to) (2개의 등호로 표시 또는 ==)과 같다는 의미는 아니다. 동일 인스턴스 는 클래스 타입의 2개의 상수 또는 변수가 동일한 클래스 인스턴스를 참조한다는 의미이다. 같음은 두 인스턴스의 값이 동일하거나 동등하다는 것을 의미한다.
커스텀 구조체와 클래스를 정의할 때 두 인스턴스가 같은지의 여부를 결정하는 것은 사용자의 몫이다. == 와 != 연산자의 자체 구현 선언의 프로세스는 등가 연산자 (Equivalence Operators) 에 자세히 설명되어 있다.
C, C++, 또는 Objective-C에 경험이 있다면 메모리의 주소를 참조하기 위해 포인터 (pointers) 를 사용한다는 것을 알고 있을 것이다. 일부 참조 타입의 인스턴스를 참조하기 위한 Swift 상수 또는 변수는 C의 포인터와 유사하지만 메모리의 주소에 대한 직접적인 포인터가 아니며 포인터 표시를 위해 별표 (*)를 작성할 필요가 없다. 대신에 이러한 참조는 Swift의 다른 상수 또는 변수처럼 정의된다. Swift 표준 라이브러리는 포인터와 직접 상호작용이 필요한 경우 사용할 수 있는 포인터와 버퍼 타입을 제공한다.