스위프트 (프로그래밍 언어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
스위프트는 2010년 애플에 의해 개발된 범용 프로그래밍 언어이다. Objective-C를 대체하기 위해 개발되었으며, Rust, Haskell, Ruby, Python 등 다양한 언어의 영향을 받았다. 2014년 1.0 버전이 출시되었으며, 이후 지속적인 업데이트를 통해 발전해왔다. 스위프트는 현대적인 언어 기능을 제공하며, 안전성, 속도, 인터랙티브한 개발 환경을 특징으로 한다. 주요 기능으로는 옵셔널, 값 타입, 확장, 프로토콜 지향 프로그래밍, 동시성, 메모리 관리가 있으며, C 언어 계열 언어와 유사한 구문을 가지고 있지만, 타입 추론, 제네릭 프로그래밍, 함수를 일급 객체로 지원하는 등 Objective-C와 차별화된 특징을 보인다. 스위프트는 애플의 운영체제 뿐만 아니라 리눅스, 윈도우, 안드로이드에서도 지원되며, Xcode를 통해 개발 환경을 제공한다.
더 읽어볼만한 페이지
- 2014년 개발된 프로그래밍 언어 - 핵 (프로그래밍 언어)
Hack은 페이스북에서 개발한 프로그래밍 언어이며, PHP와 상호 운용되도록 설계되었고, 정적 타이핑을 도입하여 타입 힌트를 확장하며 PHP 7에도 영향을 미쳤다. - 선언형 프로그래밍 - 제약 프로그래밍
제약 프로그래밍은 제약 조건을 프로그래밍 언어에 통합하여 제약 만족 문제 해결에 사용되는 패러다임으로, 제약 조건 유형과 다양한 해 탐색 알고리즘을 활용하여 여러 영역에 적용될 수 있다. - 선언형 프로그래밍 - 사이퍼 (질의어)
사이퍼는 그래프 데이터베이스의 데이터를 쿼리하고 조작하는 선언적 질의 언어로, 노드, 관계, 레이블, 프로퍼티 기반의 그래프 모델을 사용하며 `MATCH`, `WHERE`, `RETURN` 등의 키워드로 데이터를 검색, 생성, 수정, 삭제하고 국제 표준 그래프 질의어(GQL) 표준에 영향을 주어 오픈사이퍼 프로젝트를 통해 표준화가 진행 중이다. - 패턴 매칭 프로그래밍 언어 - AWK
AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다. - 패턴 매칭 프로그래밍 언어 - 하스켈
하스켈은 해스켈 커리의 이름을 딴 순수 함수형 프로그래밍 언어로, 여러 함수형 언어 통합 노력의 결과로 탄생하여 느긋한 계산법, 패턴 매칭, 타입 클래스, 모나드 등의 특징을 가지며 GHC가 표준 구현체로 사용된다.
스위프트 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
이름 | 스위프트 (프로그래밍 언어) |
원래 이름 | Swift |
![]() | |
설계자 | 크리스 래트너, Doug Gregor, John McCall, Ted Kremenek, Joe Groff, 그리고 애플 |
개발자 | 애플 및 오픈 소스 기여자 |
출시일 | 2014년 6월 2일 |
최신 안정화 버전 | 5.10 |
최신 안정화 버전 출시일 | 2024년 3월 5일 |
미리보기 버전 | 6.0 |
타이핑 | 정적, 강한, 추론 |
메모리 관리 | 자동 참조 카운팅 |
운영 체제 | Apple 운영 체제 (Darwin, iOS, iPadOS, macOS, tvOS, visionOS, watchOS), Linux, Windows, Android, z/OS |
라이선스 | 아파치 라이선스 2.0 (스위프트 2.2 이후) 독점 (스위프트 2.2까지) |
웹사이트 | 스위프트 공식 웹사이트 애플 개발자 스위프트 |
파일 확장자 | .swift, .SWIFT |
영향 | |
영향을 받은 언어 | Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, D |
영향을 준 언어 | Rust, V (Vlang) |
특징 | |
패러다임 | 다중 패러다임: 프로토콜 지향, 객체 지향, 함수형, 명령형, 블록 구조, 선언형, 동시성 |
2. 역사
스위프트 개발은 2010년 7월 크리스 래트너에 의해 시작되었으며, 이후 애플의 여러 프로그래머들이 협력하여 진행되었다. 스위프트는 Objective-C를 대체할 현대적인 언어로 기획되었으며, 러스트, 하스켈, 루비, 파이썬, C#, CLU 등 다양한 언어로부터 아이디어를 얻었다.[6]
2014년 6월 2일, 애플 세계 개발자 컨퍼런스(WWDC)에서 스위프트로 작성된 최초의 공개 앱이 발표되었다.[26] 이 컨퍼런스에서 스위프트의 베타 버전이 애플 개발자들에게 공개되었고, 500페이지 분량의 무료 매뉴얼 ''The Swift Programming Language''도 함께 배포되었다.[27]
스위프트는 2014년 9월 9일 Xcode 6.0과 함께 1.0 버전을 달성했다.[28] 이후 지속적인 버전 업데이트를 통해 발전해왔다.
2015년 12월 3일, 스위프트는 Apache 2.0 라이선스 하에 오픈 소스로 공개되었고, [https://swift.org Swift.org]가 만들어졌다.[37]
2016년 WWDC 2016에서는 iPad용 앱 스위프트 플레이그라운드가 발표되어, 스위프트 학습을 위한 직관적인 환경을 제공하게 되었다.[42]
2017년 1월, 크리스 래트너가 테슬라 모터스로 이직하면서, 스위프트 프로젝트 책임자는 테드 크레메넥으로 변경되었다.[45]
2019년 WWDC 2019에서는 SwiftUI 프레임워크가 발표되어, 모든 애플 플랫폼에서 선언적 UI 개발 방식을 지원하게 되었다.[47]
2021년에는 Swift 5.5에서 Async/await 도입을 통해 비동기 프로그래밍의 편의성이 개선되었으며, 액터 모델을 통해 동시성 프로그래밍의 안전성을 강화했다.
스위프트는 애플의 운영체제 (Darwin, iOS, iPadOS, macOS, tvOS, watchOS)뿐만 아니라, 리눅스, 윈도우, 안드로이드 등 다양한 플랫폼을 지원한다.[51]
2. 1. 스위프트 1.x
스위프트 개발은 2010년 7월 크리스 래트너에 의해 시작되었으며, 이후 애플의 여러 프로그래머들이 협력하여 진행되었다. 스위프트는 1980년대 초 이후 거의 변화가 없었고, 현대적인 언어 기능을 갖추지 못한 애플의 이전 프로그래밍 언어 Objective-C를 대체할 필요성에 의해 동기가 부여되었다. 스위프트는 "Objective-C, 러스트, 하스켈, 루비, 파이썬, C#, CLU 등 너무나 많은 언어들로부터" 언어적 아이디어를 가져왔다.[6] 2014년 6월 2일, 애플 세계 개발자 컨퍼런스 (WWDC) 애플리케이션은 스위프트로 작성된 최초의 공개 출시 앱이 되었다.[26] 베타 버전의 프로그래밍 언어는 컨퍼런스에서 등록된 애플 개발자들에게 공개되었지만, 애플은 스위프트의 최종 버전이 테스트 버전과 소스 코드 호환될 것이라고 약속하지 않았다. 애플은 전체 릴리스에 필요한 경우 소스 코드 변환기를 제공할 계획이었다.[26]500페이지 분량의 무료 매뉴얼인 ''The Swift Programming Language''도 WWDC에서 공개되었으며, 애플 북스 스토어와 공식 웹사이트에서 이용할 수 있다.[27]
스위프트는 1.0, 1.1, 1.2 버전을 거치며 발전하였다.
2. 1. 1. 스위프트 1.0
스위프트는 2014년 9월 9일, Xcode 6.0의 ''Gold Master''와 함께 iOS에서 1.0 버전을 달성했다.[28] 스위프트 1.1은 2014년 10월 22일 Xcode 6.1과 함께 출시되었다.[29] 스위프트 1.2는 2015년 4월 8일 Xcode 6.3과 함께 출시되었다.[30]Swift 버전 | 출시일 | macOS | 리눅스 | 윈도우 |
---|---|---|---|---|
1.0 | 2014년 9월 9일 | |||
1.1 | 2014년 10월 22일 | |||
1.2 | 2015년 4월 8일 |
2. 1. 2. 스위프트 1.1
스위프트 1.1은 2014년 10월 22일 Xcode 6.1과 함께 출시되었다.[29]2. 1. 3. 스위프트 1.2
스위프트 1.2는 2015년 4월 8일 Xcode 6.3과 함께 출시되었다.[30]2. 2. 스위프트 2.x
WWDC 2015에서 스위프트 2.0이 발표되었고, 2015년 9월 21일에 앱 스토어에 앱을 게시할 수 있게 되었다.[31] 주요 변경 사항은 다음과 같다.- `println` 함수가 `print` 함수로 변경되었다.
println("Hello, World!")
//Swift 2.0 이후
print("Hello, World!")
스위프트 2.2부터 리눅스의 우분투 배포판용 SDK와 툴체인의 공식 다운로드가 가능해졌다.[48] 스위프트 2.2까지는 C 스타일 for 문이 지원되었으나, 스위프트 3.0부터는 지원되지 않는다.
for (var i=0;i<10;i++) {
print(i)
}
//Swift 3.0 이후
for i in 0..<10 {
print(i)
}
2. 2. 1. 스위프트 2.0
스위프트 2.0은 WWDC 2015에서 발표되었으며, 2015년 9월 21일에 앱 스토어에 앱을 게시할 수 있게 되었다.[31]```text
//Swift 2.0 이전
println("Hello, World!")
//Swift 2.0 이후
print("Hello, World!")
2. 2. 2. 스위프트 2.1
WWDC 2015에서 스위프트 2.0이 발표되었으며, 2015년 9월 21일에 앱 스토어에서 앱 게시가 가능하게 되었다.[31]2. 2. 3. 스위프트 2.2
리눅스의 우분투 배포판용 SDK와 툴체인의 공식 다운로드는 스위프트 2.2부터 가능해졌다.[48]2. 3. 스위프트 3.x
스위프트 3.0은 2016년 9월 13일에 출시되었다.[32] 이전 버전과 비교하여 문법이 일부 변경되었다.이전 버전 | 변경 후 |
---|---|
| |
2. 3. 1. 스위프트 3.0
스위프트 3.0은 2016년 9월 13일에 출시되었다.[32]이전 버전 | 변경 후 |
---|---|
| |
2. 3. 2. 스위프트 3.1
주어진 원본 소스에는 스위프트 3.1이 2017년 3월 27일에 출시되었다는 내용이 없다. 따라서 해당 섹션에는 내용을 추가할 수 없다.2. 4. 스위프트 4.x
스위프트 4.0은 2017년 9월 19일에 출시되었고,[33] 스위프트 4.1은 2018년 3월 29일에 출시되었다.[34] 스위프트 4.2는 2018년 9월 17일에 출시되었다.[33]2. 4. 1. 스위프트 4.0
스위프트 4.0은 2017년 9월 19일에 출시되었다.[33]2. 4. 2. 스위프트 4.1
스위프트 4.1은 2018년 3월 29일에 출시되었다.[34]2. 4. 3. 스위프트 4.2
스위프트 4.2는 2018년 9월 17일에 출시되었다.[33]2. 5. 스위프트 5.x
스위프트 5.0 이후 버전들은 2019년 3월부터 꾸준히 업데이트되며 여러 기능이 추가되거나 개선되었다.[6] 주요 버전별 변경 사항은 다음과 같다.버전 | 출시일 | 주요 변경 사항 |
---|---|---|
스위프트 5.0 | 2019년 3월 25일 | 바이너리 인터페이스 안정화, 애플 OS에 스위프트 런타임 표준 포함[6] |
스위프트 5.1 | 2019년 9월 20일 | 모듈 안정화, 바이너리 프레임워크 생성 및 공유 가능[47] |
스위프트 5.2 | 2020년 3월 24일 | 센트OS, 아마존 리눅스 등 우분투 배포판용 SDK 및 툴체인 공식 다운로드 지원[48] |
스위프트 5.3 | 2020년 9월 16일 | 윈도우 공식 지원[48] |
스위프트 5.5 | 2021년 | Async/await 언어 지원 확장, 액터 모델 도입[47] |
2. 5. 1. 스위프트 5.0
스위프트 5.0은 2019년 3월 25일, Xcode 10.2와 함께 출시되었다.[6] 이 버전에서는 바이너리 인터페이스가 안정화되어, 애플 OS에 스위프트 런타임이 표준으로 포함되었다.[6]2. 5. 2. 스위프트 5.1
스위프트 5.1은 2019년 9월 20일 Xcode 11.0과 함께 출시되었다.[47] 모듈 안정화가 이루어져 바이너리 프레임워크 생성 및 공유가 가능해졌다.2. 5. 3. 스위프트 5.2
스위프트 5.2는 2020년 3월 24일 Xcode 11.4와 함께 출시되었다.[48] 스위프트 5.2.4부터는 센트OS와 아마존 리눅스 등 더 많은 우분투 배포판용 SDK와 툴체인의 공식 다운로드가 가능하다.[48]2. 5. 4. 스위프트 5.3
스위프트 5.3은 2020년 9월 16일에 출시되었으며, 약 1주일 뒤 윈도우가 공식적으로 지원되었다.[48]2. 5. 5. 스위프트 5.5
스위프트 5.5는 2021년 WWDC에서 발표되었으며, Async/await의 언어 지원이 확장되고 자체 버전의 액터 모델이 도입되었다.[47]2. 6. 스위프트 6.x
주어진 원본 소스에는 스위프트 6.x 버전에 대한 구체적인 정보가 없다. 스위프트 6.0에 대한 내용도 하위 섹션에 이미 포함되어 있으므로, 이 섹션에는 별도로 작성할 내용이 없다.2. 6. 1. 스위프트 5.10
Swift영어 5.10은 2024년 3월 5일에 출시되었다. 이 버전에서는 언어의 동시 처리 모델이 개선되어, 데이터 경합을 피하기 위한 데이터 분리가 가능해졌다.[48]2. 6. 2. 스위프트 6.0
주어진 소스에는 스위프트 6.0에 대한 구체적인 정보가 없다. 요약에 따르면 2024년 9월 17일에 출시되었다는 언급만 있을 뿐이다.3. 특징
스위프트는 현대적인 프로그래밍 언어 이론을 바탕으로 설계되어, 간결하고 안전하며 빠른 성능을 제공한다. Objective-C, Rust, Haskell, Ruby, Python, C#, CLU 등 다양한 언어의 영향을 받아 개발되었다.[111]
스위프트는 안전성, 성능, 표현력, 상호 운용성, 그리고 오픈 소스라는 주요 특징을 가진다.
- 안전성: 타입 안전성, 메모리 관리, 오류 처리 등 안전한 코드를 작성하기 위한 기능을 제공한다. 기본적으로 모든 메모리를 자동으로 관리하고, 변수가 사용되기 전에 항상 초기화되도록 보장한다. 배열 접근은 범위를 벗어난 오류를 확인하고, 정수 연산은 오버플로를 확인한다.[71][72]
- 빠른 성능: LLVM 컴파일러 기술을 기반으로 최적화되어 빠른 실행 속도를 제공한다.
- 표현력: 간결하고 가독성이 높은 문법을 통해 개발 생산성을 높인다.
- 상호 운용성: Objective-C 코드와의 완벽한 상호 운용성을 제공하여 기존 코드를 재사용할 수 있다.[132]
- 오픈 소스: Apache 2.0 라이선스 하에 오픈 소스로 공개되어 누구나 자유롭게 사용하고 기여할 수 있다.[113]
스위프트는 2010년 LLVM과 Clang의 시조인 크리스 래트너에 의해 개발이 시작되었다.[111] 2014년 WWDC에서 일반에 발표되었으며, 2015년에는 오픈 소스화되었다.[113]
크레이그 페더리기는 스위프트 발표 당시 "C 언어의 짐이 없는 Objective-C"라고 표현했다.
3. 1. 문법
스위프트는 C 스타일 언어와 유사한 문법을 가지고 있다. 코드 실행은 기본적으로 전역 범위에서 시작한다.[73] 한 줄에 여러 구문을 작성할 때는 세미콜론(;)이 필요하지만, 필수는 아니다.변수는 `var` 키워드를 사용하여 선언하고, 상수는 `let` 키워드를 사용하여 선언한다. 타입 추론을 지원하여 변수 선언 시 타입을 명시하지 않아도 된다.[73]
함수는 `func` 키워드를 사용하여 정의하며, 매개변수 이름과 반환 타입을 명확하게 지정한다. 클로저(익명 함수)를 지원하여 익명 함수를 만들고 다른 함수에 전달할 수 있다.[75]
제어 흐름은 `if-else`, `guard`, `switch`, `while`, `for-in` 등의 문을 사용하여 관리한다.
스위프트는 클로저를 지원하며, 코드 내에서 전달하고 사용할 수 있는 자체 포함 기능 블록이다.[75] 익명 함수로도 사용될 수 있으며, 주요 특징은 다음과 같다.
- 클로저 유형은 입력 및 출력 값으로 정의되며 클로저 외부 또는 내부에서 지정할 수 있다.
- 대부분의 경우 클로저의 반환 유형은 컴파일러에 의해 자동으로 추론될 수 있다.
// 클로저 유형을 외부에서 지정
let closure1: (Int, Int) -> Int = { arg1, arg2 in
return arg1 + arg2
}
// 클로저 유형을 내부에서 지정
let closure2 = { (arg1: Int, arg2: Int) -> Int in
return arg1 + arg2
}
// 반환 유형 자동 추론
let closure3 = { arg1: Int, arg2: Int in
return arg1 + arg2
}
클로저는 변수와 상수에 할당할 수 있으며 다른 함수나 클로저에 매개변수로 전달할 수 있다. 단일 표현식 클로저는 `return` 키워드를 생략할 수 있다.
스위프트는 트레일링 클로저 구문을 지원하여, 클로저를 함수의 매개변수 목록 내가 아닌 함수 호출 끝부분에 작성할 수 있다. 클로저가 함수의 유일한 매개변수인 경우 괄호를 완전히 생략할 수 있다.
// 정수를 반환하는 클로저를 받아 평가하고, 그 반환 값을 함수의 반환 값으로 사용
func foo(closure bar: () -> Int) -> Int {
return bar()
}
foo(closure: { return 1 }) // 트레일링 클로저 구문 미사용
foo { 1 } // 트레일링 클로저 구문 사용, 암시적 반환
스위프트 5.3부터는 여러 개의 트레일링 클로저를 지원한다.[76]
// 첫 번째 클로저의 반환 값을 두 번째 클로저의 매개변수로 전달, 두 번째 클로저의 결과 반환
func foo(bar: () -> Int, baz: (Int) -> Int) -> Int {
return baz(bar())
}
foo(bar: { return 1 }, baz: { x in return x + 1 }) // 트레일링 클로저 미사용
foo(bar: { return 1 }) { x in return x + 1 } // 트레일링 클로저 1개
foo { return 1 } baz: { x in return x + 1 } // 트레일링 클로저 2개 (첫 번째 클로저 인자 이름 생략)
스위프트는 인라인 클로저에 대한 단축 인자 이름을 제공하여, `$0`, `$1`, `$2` 등으로 인수를 참조할 수 있게 한다.[77]
let names = ["Josephine", "Steve", "Chris", "Barbara"]
// names의 각 값에 대해 클로저 호출, 문자 수가 6 미만인 값 유지, 나머지 삭제
let shortNames = names.filter { $0.count < 6 }
print(shortNames) // "[Steve", "Chris"]" 출력
클로저는 주변 범위의 값을 캡처할 수 있으며, 클로저가 존재하는 한 이 값을 참조한다.
func makeMultiplier(withMultiple multiple: Int) -> (Int) -> (Int) {
// Int를 받아 multiple 값으로 곱한 입력을 반환하는 클로저 생성 및 반환
return {
$0 * multiple
}
}
let multiplier = makeMultiplier(withMultiple: 3)
print(multiplier(3)) // "9" 출력
print(multiplier(10)) // "30" 출력
스위프트 표준 라이브러리에는 유니코드 호환 `String` 및 `Character` 타입이 포함되어 있다. 문자열 값은 이중 인용 부호로 묶인 문자열 리터럴로 초기화할 수 있으며, `+` 연산자로 연결할 수 있다.
var someString = "Hello,"
someString += " world!"
문자열 보간을 사용하면 다른 값과 표현식에서 새 문자열을 생성할 수 있다. `\`가 앞에 붙은 괄호 안의 값은 문자열 리터럴에 삽입된다.[78]
var currentScore = 980
print("Your score is \(currentScore).") // "Your score is 980." 출력
`for-in` 루프를 사용하여 문자열에 포함된 문자를 반복할 수 있다.
for character in "Swift" {
print(character)
}
// S
// w
// i
// f
// t
Foundation 프레임워크를 가져오면 스위프트는 문자열 타입을 Objective-C에서 일반적으로 사용되는 NSString에 보이지 않게 브리징한다.
3. 1. 1. 예제 코드
스위프트의 구문은 C 스타일 언어와 유사하다. 코드는 기본적으로 전역 범위에서 실행을 시작한다.[73] 구조체, 클래스 또는 열거형 선언에 속성을 적용하여 프로그램의 진입점을 포함하도록 지정할 수도 있다.[74]스위프트의 "Hello, World!" 프로그램은 다음과 같다.
print("Hello, world!")
여기서 사용된 함수는 스위프트 표준 라이브러리에 포함되어 있어 외부 모듈을 가져올 필요 없이 모든 프로그램에서 사용할 수 있다. 스위프트 구문은 세미콜론으로 끝낼 필요는 없지만, 같은 줄에 여러 구문을 작성하려면 세미콜론이 필요하다. 한 줄 주석은 `//`로 시작하여 현재 줄의 끝까지 이어진다. 여러 줄 주석은 `/*`와 `*/` 문자로 묶인다.
상수는 `let` 키워드로, 변수는 `var` 키워드로 선언한다. 값을 읽기 전에 초기화해야 하며, 제공된 초기 값의 유형에 따라 유형을 유추할 수 있다. 초기 값이 값의 선언 후에 설정된 경우, 유형을 명시적으로 선언해야 한다.[73]
let highScoreThreshold = 1000 // Int 유형의 상수. 제공된 값을 기반으로 유형이 유추되었습니다.
var currentScore = 980 // Int 유형의 변수.
currentScore = 1200 // 변수의 값은 시간이 지남에 따라 변경될 수 있습니다.
let playerMessage: String // String 유형을 명시적으로 지정한 상수.
if currentScore > highScoreThreshold {
playerMessage = "You are a top player!"
} else {
playerMessage = "Better luck next time."
}
print(playerMessage) // Prints "You are a top player!"
스위프트의 제어 흐름은 if-else, guard, switch 문과 while, for-in 루프를 사용하여 관리된다.
`if` 문은 부울 매개변수를 취하고 조건이 참이면 `if` 문의 본문을 실행하고, 그렇지 않으면 선택적 `else` 본문을 실행한다. `if-let` 구문은 옵셔널 값의 존재를 확인하고 동시에 래핑 해제하는 구문 설탕을 제공한다.
let someNumber = 42
if someNumber % 2 == 0 { // 나머지 연산자를 사용하여 someNumber을 2로 나눈 나머지를 찾습니다.
print("\(someNumber) is even.")
} else {
print("\(someNumber) is odd.")
}
// Prints "42 is even."
함수는 `func` 키워드로 정의된다. 함수 매개변수는 구문처럼 읽을 수 있는 이름을 가질 수 있다. 매개변수 이름 앞에 밑줄을 사용하면 호출 사이트에서 인수 레이블을 생략할 수 있다. 튜플은 함수가 한 번에 여러 데이터 조각을 반환하는 데 사용할 수 있다.
func constructGreeting(for name: String) -> String {
return "Hello \(name)!"
}
let greeting = constructGreeting(for: "Craig")
print(greeting) // Prints "Hello Craig!"
함수와 클로저로 알려진 익명 함수는 다른 값과 마찬가지로 속성에 할당되어 프로그램 전체에서 전달될 수 있다.
func divideByTwo(_ aNum: Int) -> Int {
return aNum / 2
}
func multiplyByTwo(_ aNum: Int) -> Int {
return aNum * 2
}
let mathOperation = multiplyByTwo
print(mathOperation(21)) // Prints "42"
`guard` 문은 `guard` 문을 지나 계속 진행하기 전에 주어진 조건이 참이어야 하며, 그렇지 않으면 제공된 `else` 절의 본문이 실행된다. `else` 절은 `guard` 문이 나타나는 코드 블록의 제어를 종료해야 한다. `guard` 문은 프로그램 실행을 계속하기 전에 특정 요구 사항이 충족되었는지 확인하는 데 유용하다. 특히 옵셔널 값의 래핑 해제된 버전을 생성하는 데 사용할 수 있으며, 이는 묶여 있는 범위의 나머지 부분에 대해 nil이 아닌 것으로 보장된다.
func divide(numerator: Int?, byDenominator denominator: Int) -> Int? {
guard denominator != 0 else {
print("Can't divide by 0.")
return nil
}
guard let numerator else {
print("The provided numerator is nil.")
return nil
}
return numerator / denominator
}
let result = divide(numerator: 3, byDenominator: 0)
print("Division result is: \(result)")
// Prints:
// "Can't divide by 0."
// "Division result is: nil."
`switch` 문은 값을 여러 잠재적 값과 비교한 다음 연관된 코드 블록을 실행한다. `switch` 문은 모든 가능한 값에 대한 case를 포함하거나 제공된 값이 다른 case와 일치하지 않을 때 실행되는 `default` case를 포함하여 완전해야 한다. `switch` case는 명시적으로 `fallthrough` 키워드를 사용하여 수행할 수 있지만, 암시적으로는 폴스루(fall through)하지 않는다. 패턴 매칭은 `switch` 문 내에서 다양한 방식으로 사용할 수 있다. 다음은 정수가 여러 잠재적 범위와 일치하는 예이다.
let someNumber = 42
switch someNumber {
case ..<0:
print("\(someNumber) negative.")
case 0:
print("\(someNumber) is 0.")
case 1...9:
print("\(someNumber) greater than 0, but less than 10.")
default:
print("\(someNumber) is greater than 9.")
}
// Prints "42 is greater than 9."
`for-in` 루프는 일련의 값을 반복한다.
let names = ["Will", "Anna", "Bart"]
for name in names {
print(name)
}
// Prints:
// Will
// Anna
// Bart
`while` 루프는 주어진 부울 조건이 `true`로 평가되는 동안 반복한다.
// 1부터 5까지의 모든 숫자를 더합니다.
var i = 1
var result = 0
while i <= 5 { // 루프는 i가 5보다 작거나 같은 동안 본문을 수행합니다.
result += i // 현재 결과에 i를 더합니다.
i += 1 // i를 1씩 증가시킵니다.
}
print(result) // Prints "15"
print("Hello, World!") // 이것만으로 실행되어 Hello, World!가 출력된다.
/*
- 주석은 C 스타일의 여러 줄 주석과...
- /
// C++ 스타일의 한 줄 주석을 모두 지원한다.
// var name: Type = value 로 Type 타입의 변수 name을 선언하고 value로 초기화한다.
var explicitDouble: Double = 70 // 70.0
/// 타입이 생략된 경우에는 타입 추론에 의해 초기값의 타입이 적용된다.
var implicitInteger = 70 // Int
var implicitDouble = 70.0 // Double
// let name: Type = value 로 Type 타입의 상수 name에 value를 설정한다.
// 타입 추론이 가능한 경우, 타입 표기는 생략할 수 있다.
let theAnswer = 42
// 식별자에는 대부분의 유니코드 문자를 사용할 수 있다.
let 사과의_수 = 3
let 귤의_수 = 5
// 문자열 리터럴 "..." 안에 있는 \(expr)에는 식 expr의 내용이 전개된다.
let 사과_설명 = "나는 \(사과의_수)개의 사과를 가지고 있다." // "나는 3개의 사과를 가지고 있다."
let 과일_설명 = "나는 \(사과의_수 + 귤의_수)개의 과일을 가지고 있다." // "나는 8개의 과일을 가지고 있다."
// Swift에서는 딕셔너리도 내장으로 지원된다.
// 아래는 Dictionary
let people = ["Anna": 67, "Bety": 8, "Jack": 33, "Sam": 25]
// 딕셔너리의 내용 열거는 for (key, value) in dict { ... }
for (name, age) in people {
print("\(name) is \(age) years old.")
}
// 메서드나 함수는 "func" 문법을 사용하여 선언한다.
// 파라미터 이름 지정에 주의. -> 로 반환값의 타입을 선언한다.
func sayHello(to personName: String) -> String {
let greeting = "안녕하세요, " + personName + "님"
return greeting
}
// "안녕하세요, 서버님"을 출력
print(sayHello(to: "서버"))
3. 2. 주요 기능
스위프트는 현대적이고 안전한 프로그래밍을 지원하는 여러 주요 기능을 제공한다.- 옵셔널(Optionals): 값이 없을 수 있는 상황을 안전하게 처리한다. `?`를 사용하여 옵셔널 타입을 선언하고, `!` 또는 `?.` (옵셔널 체이닝)을 사용하여 값에 접근한다. 옵셔널은 널 포인터 에러를 방지하고, 정적 디스패치를 가능하게 한다.[80][81]
- 값 타입(Value Types): `struct`를 사용하여 값 전달 의미 체계를 지원한다. 구조체는 클래스와 유사하지만 상속을 지원하지 않는다. `Int`, `Double`, `String`, `Array` 등 대부분의 기본 타입이 값 타입으로 구현되어 성능 향상에 기여한다.[82][83] `Array`, `Dictionary`, `Set` 등은 쓰기 시 복사를 통해 효율성을 높인다.[84]
- 확장(Extensions): `extension` 키워드를 사용하여 기존 타입에 새로운 기능(메서드, 초기화 구문, 계산된 프로퍼티 등)을 추가할 수 있다. 이를 통해 코드 구성 및 가독성을 향상시킨다.[85]
- 프로토콜 지향 프로그래밍(Protocol-Oriented Programming): 프로토콜은 특정 타입이 구현해야 할 요구사항을 정의하며, 다중 상속을 대체하는 유연한 메커니즘을 제공한다.[86] 확장과 제네릭 프로그래밍을 결합하여 프로토콜을 한 번 작성하고 여러 타입에서 재사용할 수 있다.[87] 프로토콜은 타입으로 사용될 수 있어 느슨한 결합을 지원한다.[88][89]
- 동시성(Concurrency): 스위프트 5.5부터 Async/await 구문을 사용하여 구조적 동시성을 지원한다. `async` 함수는 `await` 키워드를 통해 호출되며, 실행 중 일시 중단될 수 있다. `async let`을 통해 여러 함수를 병렬로 실행할 수 있다.[90] 액터 모델을 통해 변경 가능한 상태를 안전하게 공유한다.[91]
- 메모리 관리: 자동 참조 카운팅(ARC)을 사용하여 메모리를 관리한다. 강한 참조 사이클은 `weak` 또는 `unowned` 키워드를 사용하여 방지한다.[99] 클로저 내의 `self` 참조는 캡처 목록을 사용하여 강한 참조 사이클을 방지할 수 있다.[131]
3. 2. 1. 옵셔널(Optionals)
스위프트의 중요한 기능 중 하나는 옵셔널 타입으로, 값이 없을 수 있는 상황을 안전하게 처리하기 위한 기능이다. C에서 포인터가 특정 값을 참조하거나 아무 값도 참조하지 않을 수 있는 것과 유사하게 작동한다.[80] 옵셔널이 아닌 타입은 널 포인터 에러를 발생시킬 수 없으며, 컴파일러는 이것이 불가능하도록 보장한다.옵셔널 타입은 `Optional` 열거형으로 생성된다. 널이 될 수 있는 정수를 만들려면 `var optionalInteger: Optional
옵셔널 타입 내부의 값에 접근하려면, 우선 nil이 아님을 확인하고, 내부의 인스턴스를 노출하기 위해 '언래핑(unwrapping)'해야 한다. 이는 `!` 연산자를 사용하여 수행한다.
```swift
let myValue = anOptionalInstance!.someMethod()
```
위 코드에서 `!` 연산자는 `anOptionalInstance`을 언래핑하여 내부의 인스턴스를 노출하고 메서드 호출을 수행한다. 만약 `anOptionalInstance`이 nil이면, 널 포인터 에러가 발생하여 프로그램이 종료된다. 이를 강제 언래핑이라고 한다.
옵셔널은 옵셔널 체이닝을 사용하여 안전하게 언래핑될 수 있다. 옵셔널 체이닝은 먼저 인스턴스가 nil인지 테스트한 다음, nil이 아닌 경우 언래핑한다.
```swift
let myValue = anOptionalInstance?.someMethod()
```
위 코드에서 런타임은 `someMethod`를 `anOptionalInstance`이 nil이 아닌 경우에만 호출하여 에러를 억제한다. `?`는 모든 옵셔널 속성 뒤에 배치해야 한다. 이러한 속성 중 하나라도 nil이면 전체 표현식은 nil로 평가된다. '체이닝'이라는 용어는 여러 메서드 호출/게터가 함께 연결되는 더 일반적인 경우에서 비롯된다. 예를 들면 다음과 같다.
```swift
let leaseStart = aBuilding.tenantList[5].leaseDetails?.startDate
```
스위프트의 옵셔널 사용은 언래핑 작업이 런타임 디스패치 시스템에서 발생하는 대신 정의된 인스턴스(래퍼)에서 호출되기 때문에 컴파일러가 정적 디스패치를 사용할 수 있도록 한다.
3. 2. 2. 값 타입(Value Types)
스위프트는 `struct` 선언을 사용하여 값 전달 의미 체계를 사용하는 객체에 대한 내장 지원을 제공한다. 스위프트의 구조체는 클래스와 거의 동일한 기능을 갖추고 있다. 메서드, 프로토콜 구현 및 확장 메커니즘 사용 등이 있다. 그러나 구조체는 상속을 지원하지 않는다.[82]프로그래머는 애플리케이션의 각 데이터 구조에 어떤 의미 체계가 더 적합한지 자유롭게 선택할 수 있다. 2D 점과 같은 작은 구조는 값 전달 방식을 사용하고 간접 참조나 참조 카운팅 없이 내부 데이터에 직접 접근할 수 있도록 구조체로 정의할 수 있다. 값 전달 개념에 내재된 성능 향상은 스위프트가 `Int` 및 `Double`을 포함한 거의 모든 공통 데이터 타입과 `String` 및 `Array`와 같이 일반적으로 객체로 표현되는 타입에 이러한 타입을 사용하는 정도이다.[82] 값 타입을 사용하면 사용자 애플리케이션에서 상당한 성능 향상을 얻을 수 있다.[83]
`Array`, `Dictionary` 및 `Set`은 모두 쓰기 시 복사를 활용하여 프로그램이 값을 변경하려 할 때만 해당 데이터가 복사된다. 즉, 다양한 접근자는 동일한 데이터 저장소에 대한 효과적인 포인터를 갖는다. 따라서 데이터가 메모리에 하나의 인스턴스로 물리적으로 저장되는 동안, 애플리케이션 수준에서는 이러한 값은 별개이며 필요한 경우에만 쓰기 시 복사로 물리적 분리가 적용된다.[84]
3. 2. 3. 확장(Extensions)
확장은 기존 타입에 새로운 기능을 추가하는 것으로, 하위 클래스를 생성하거나 원본 소스 코드에 접근할 필요가 없다. 확장은 새로운 메서드, 초기화 구문, 계산된 프로퍼티, 서브스크립트 및 프로토콜 준수를 추가할 수 있다.[85] 예를 들어 기본 `String` 타입에 맞춤법 검사기를 추가하면, 프로그램의 모든 `String` 인스턴스에서 맞춤법 검사 기능을 사용할 수 있다. 이러한 특성 덕분에 확장은 관련 코드를 라이브러리와 같은 곳에 모아 코드 구성을 체계화하는 데에도 널리 사용된다.확장은 `extension` 키워드로 선언된다. 다음은 `Rectangle` 구조체에 `area` 계산 프로퍼티를 추가하는 예시이다.
```swift
struct Rectangle {
let width: Double
let height: Double
}
extension Rectangle {
var area: Double {
return height * width
}
}
3. 2. 4. 프로토콜 지향 프로그래밍(Protocol-Oriented Programming)
프로토콜은 특정 타입이 구현해야 할 메서드, 프로퍼티 등의 요구사항을 정의한다. 이는 다중 상속을 대체하기 위해 현대 객체 지향 언어에서 자주 사용되지만, 기능이 완전히 동일하지는 않다.[86] 프로토콜을 통해 객체 간의 느슨한 결합을 유지하고, 코드의 유연성과 확장성을 높일 수 있다.Objective-C 등 프로토콜 개념을 구현하는 대부분의 다른 언어에서는 각 클래스에서 필수 메서드가 구현되도록 프로그래머가 보장해야 한다.[86] Swift는 확장을 사용하여 이러한 메서드를 추가하고 제네릭 프로그래밍(제네릭)을 사용하여 이를 구현하는 기능을 추가한다. 이를 결합하면 프로토콜을 한 번 작성하여 다양한 인스턴스를 지원할 수 있다. 또한 확장 메커니즘을 사용하여 정의에 해당 프로토콜을 나열하지 않는 객체에 프로토콜 적합성을 추가할 수 있다.[87]
예를 들어, `Printable`이라는 프로토콜을 선언할 수 있으며, 이는 프로토콜을 준수하는 인스턴스가 `description` 프로퍼티와 `printDetails()` 메서드 요구 사항을 구현하도록 보장한다.
```swift
// Printable이라는 프로토콜 정의
protocol Printable {
var description: String { get } // 읽기 전용 프로퍼티 요구 사항
func printDetails() // 메서드 요구 사항
}
```
이 프로토콜은 다른 타입에서 채택할 수 있다.
```swift
// 클래스에서 Printable 프로토콜 채택
class MyClass: Printable {
var description: String {
return "An instance of MyClass"
}
func printDetails() {
print(description)
}
}
```
확장을 사용하여 타입에 프로토콜 적합성을 추가할 수 있다. 프로토콜 자체도 요구 사항의 기본 구현을 제공하도록 확장될 수 있다. 채택자는 자체 구현을 정의하거나 기본 구현을 사용할 수 있다.
```swift
extension Printable { // 모든 Printable 인스턴스는 이 구현을 받거나 자체 구현을 정의할 수 있다.
func printDetails() {
print(description)
}
}
// Bool은 이제 Printable을 준수하며 위의 printDetails() 구현을 상속한다.
extension Bool: Printable {
var description: String {
return "An instance of Bool with value: \(self)"
}
}
```
Swift에서는 인터페이스를 지원하는 많은 현대 언어와 마찬가지로, 프로토콜을 타입으로 사용할 수 있다. 즉, 변수와 메서드를 특정 타입 대신 프로토콜로 정의할 수 있다.
```swift
func getSomethingPrintable() -> any Printable {
return true
}
var someSortOfPrintableInstance = getSomethingPrintable()
print(someSortOfPrintableInstance.description)
// "An instance of Bool with value: true" 출력
```
`someSortOfPrintableInstance`의 구체적인 타입이 무엇인지는 중요하지 않으며, 컴파일러는 프로토콜을 준수하는지 확인하므로 이 코드는 안전하다. 이 구문은 컬렉션도 `let printableArray = [any Printable]`과 같이 프로토콜을 기반으로 할 수 있음을 의미한다.
확장과 프로토콜은 Swift의 표준 라이브러리에서 광범위하게 사용된다. Swift 5.9에서는 표준 라이브러리 내의 모든 심볼의 약 1.2%가 프로토콜이었고, 다른 12.3%는 프로토콜 요구 사항 또는 기본 구현이었다.[88] 예를 들어, Swift는 확장을 사용하여 `Equatable` 프로토콜을 String 및 Array와 같은 많은 기본 타입에 추가하여 `==` 연산자로 비교할 수 있도록 한다. `Equatable` 프로토콜은 또한 이 기본 구현을 정의한다.
```swift
func !=
```
이 함수는 `Equatable`을 준수하는 모든 인스턴스에서 작동하는 메서드를 정의하여 ''같지 않음'' 연산자를 제공한다. 인스턴스, 클래스 또는 구조체는 `Equatable`을 준수하기만 하면 자동으로 이 구현을 얻는다.[89]
프로토콜, 확장 및 제네릭을 결합하여 정교한 API를 만들 수 있다. 예를 들어, 제약 조건은 채택하는 타입의 특성에 따라 타입이 프로토콜 또는 메서드를 조건부로 채택하도록 허용한다. 일반적인 사용 사례는 컬렉션 내에 포함된 요소가 `Equatable`일 때에만 컬렉션 타입에 메서드를 추가하는 것이다.
```swift
extension Array where Element: Equatable {
// allEqual은 Equatable 요소를 포함하는 Array 인스턴스에서만 사용할 수 있다.
func allEqual() -> Bool {
for element in self {
if element != self.first {
return false
}
}
return true
}
}
3. 2. 5. 동시성(Concurrency)
스위프트 5.5는 구조적 동시성을 언어에 도입했다.[90] 구조적 동시성은 코틀린, 자바스크립트, 그리고 러스트와 유사한 Async/await 구문을 사용한다. async 함수는 매개변수 목록 뒤에 `async` 키워드를 사용하여 정의된다. async 함수를 호출할 때, 호출된 함수가 실행되는 동안 실행이 일시 중단될 수 있음을 나타내기 위해 함수 앞에 `await` 키워드를 써야 한다. 함수가 일시 중단되는 동안, 프로그램은 동일한 프로그램 내에서 다른 동시 함수를 실행할 수 있다. 이 구문을 사용하면 프로그램이 잠재적인 일시 중단 지점을 명확하게 지정하고 이전에 광범위하게 사용되었던 클로저 콜백으로 인한 파멸의 피라미드 (프로그래밍)의 한 형태를 피할 수 있다.[91]```swift
func downloadText(name: String) async -> String {
let result = // ... some asynchronous downloading code ...
return result
}
let text = await downloadText("text1")
```
`async let` 구문을 사용하면 여러 함수를 병렬로 실행할 수 있다. `await`는 다시 프로그램이 이전에 호출된 `async` 함수의 완료를 기다리기 위해 일시 중단되는 지점을 표시하는 데 사용된다.
```swift
// Each of these calls to downloadText will run in parallel.
async let text1 = downloadText(name: "text1")
async let text2 = downloadText(name: "text2")
async let text3 = downloadText(name: "text3")
let textToPrint = await [text1, text2, text3] // Suspends until all three downloadText calls have returned.
print(textToPrint)
```
작업(Tasks)과 작업 그룹(TaskGroups)은 런타임 중에 동적 수의 자식 작업을 생성하기 위해 명시적으로 생성될 수 있다:
```swift
let taskHandle = Task {
await downloadText(name: "someText")
}
let result = await taskHandle.value
```
스위프트는 액터 모델을 사용하여 변경 가능한 상태를 격리하여, 서로 다른 작업이 안전한 방식으로 공유된 상태를 변경할 수 있도록 한다. 액터는 `actor` 키워드로 선언되며, 클래스와 같이 참조 타입이다. 한 번에 하나의 작업만 액터의 변경 가능한 상태에 접근할 수 있다. 액터는 자체 내부 상태에 자유롭게 접근하고 변경할 수 있지만, 별도의 작업에서 실행되는 코드는 다른 작업이 액터의 상태에 접근하는 것을 마칠 때까지 코드가 일시 중단될 수 있음을 나타내기 위해 각 접근에 `await` 키워드를 표시해야 한다.
```swift
actor Directory {
var names: [String] = []
func add(name: String) {
names.append(name)
}
}
let directory = Directory()
// Code suspends until other tasks finish accessing the actor.
await directory.add(name: "Tucker")
print(await directory.names)
3. 2. 6. 메모리 관리
스위프트는 자동 참조 카운팅(ARC)을 사용하여 메모리 관리를 한다. 프로그램이 클래스 또는 클로저의 모든 인스턴스가 유지하고 있는 참조 횟수를 지속적으로 계산한다. 이 횟수가 0에 도달하면 인스턴스가 해제된다. 인스턴스가 더 이상 필요하지 않게 되는 즉시 해제되므로 가비지 수집기가 필요하지 않다.두 인스턴스가 서로를 강하게 참조하는 경우 (예: A가 B를 참조하고 B가 A를 참조하는 경우) ''강한 참조 사이클''이 발생할 수 있다. 어떤 인스턴스의 참조 횟수도 0에 도달할 수 없으므로, 둘 다 해제되지 않아 메모리 누수가 발생한다. 스위프트는 강한 참조 사이클을 방지하기 위해 `weak` 및 `unowned` 키워드를 제공한다. 이러한 키워드를 사용하면 인스턴스가 참조 횟수를 증가시키지 않고 참조될 수 있다. `weak` 참조는 변경되어 `nil`이 될 수 있으므로 옵셔널 변수여야 한다.[99] 이미 해제된 `unowned` 값에 접근하려고 하면 런타임 오류가 발생한다.
클래스 내의 클로저는 자신(self) 참조를 캡처하여 강한 참조 사이클을 생성할 수도 있다. 약하거나 소유하지 않은 것으로 처리될 자신(self) 참조는 ''캡처 목록''을 사용하여 나타낼 수 있다.[131]
3. 3. 다른 언어와의 비교
스위프트는 C 언어 계열 프로그래밍 언어로 간주되며, C와 여러 면에서 유사하다.- 대부분의 C 연산자가 스위프트에도 존재하지만, `+` 연산자처럼 약간 다르게 동작하는 경우도 있다. 스위프트에서 `+`는 오버플로 발생 시 트랩하지만, `&+`는 오버플로 발생 시 래핑되는 C와 유사한 동작을 한다.
- 중괄호를 사용하여 문을 그룹화한다.
- 변수는 등호로 할당하지만, 두 개의 연속된 등호를 사용하여 비교한다. 두 데이터 요소가 동일한 객체를 참조하는지 확인하기 위해 새로운 ID 연산자 `===`가 제공된다.
- `while`, `if`, `switch` 제어문은 유사하지만, 확장된 기능을 갖는다. 예를 들어, `switch`는 정수가 아닌 케이스를 사용할 수 있고, 패턴 매칭을 지원하며, `while` 및 `if`는 선택적 래핑을 조건부로 해제할 수 있다. `for`는 구문을 사용한다.
- 대괄호는 배열을 선언하고 배열의 특정 인덱스에서 값을 가져올 때 사용된다.
Objective-C와 유사한 점은 다음과 같다.
- `Int`, `UInt`, `Float`, `Double`과 같은 기본 숫자 타입을 가진다.
- 클래스 메서드는 인스턴스 메서드처럼 상속된다. 클래스 메서드의 `self`는 해당 메서드가 호출된 클래스이다.
- `for`...`in` 열거 구문이 유사하다.
Objective-C와 다른 점은 다음과 같다.
- 문은 세미콜론(;)으로 끝낼 필요가 없지만, 한 줄에 둘 이상의 문을 허용하려면 사용해야 한다.
- 헤더 파일이 없다.
- 타입 추론을 사용한다.
- 제네릭 프로그래밍을 지원한다.
- 함수는 일급 객체이다.
- 열거형 케이스는 연관된 데이터(대수적 데이터 타입)를 가질 수 있다.
- 클래스에 대해 연산자를 재정의(연산자 오버로딩)할 수 있으며, 새로운 연산자를 정의할 수 있다.
- 문자열은 유니코드를 완벽하게 지원한다. 대부분의 유니코드 문자는 식별자 또는 연산자에서 사용할 수 있다.
- 예외 처리가 없다. 스위프트 2는 서로 호환되지 않는 다른 오류 처리 모델을 도입했다.[101]
- 오용하기 쉬운 C 언어 계열 언어의 몇 가지 기능이 제거되었다.
- 포인터는 기본적으로 노출되지 않는다. 프로그래머는 참조 또는 역참조를 위해 이름을 추적하고 표시할 필요가 없다.
- 할당은 값을 반환하지 않는다. 이렇게 하면 `i == 0` 대신 `i = 0`을 작성하는 일반적인 오류가 방지된다(컴파일 타임 오류 발생).
- `switch` 블록에서 `break` 문을 사용할 필요가 없다. `fallthrough` 문이 사용되지 않는 한 개별 케이스는 다음 케이스로 넘어가지 않는다.
- 변수와 상수는 항상 초기화되고 배열 경계는 항상 확인된다.
- C에서 부호 있는 정수의 정수 오버플로로 인해 정의되지 않은 동작이 발생하는 정수 오버플로는 스위프트에서 런타임 오류로 트랩된다. 프로그래머는 특수 산술 연산자 `&+`, `&-`, `&*`, `&/` 및 `&%`를 사용하여 오버플로를 허용하도록 선택할 수 있다. `min` 및 `max` 속성은 스위프트에서 모든 정수 유형에 대해 정의되며 외부 라이브러리에서 각 유형에 대해 정의된 상수에 의존하는 대신 잠재적인 오버플로를 안전하게 확인할 수 있다.
- 문 주위의 중괄호를 생략할 수 있는 `if`와 `while`의 단일 문 형태는 지원되지 않는다.
- 오프 바이 원 에러가 발생하기 쉬운 C 스타일 열거형 `for (int i = 0; i < c; i++)`은 지원되지 않는다(스위프트 3부터).[102]
- 사전 및 사후 증가 및 감소 연산자(`i++`, `--i` ...)는 지원되지 않는다(스위프트 3부터). C 스타일 `for` 문도 스위프트 3부터 지원되지 않기 때문이다.[103]
스위프트는 Cocoa와 Objective-C를 매끄럽게 사용할 수 있도록 설계되었다.[132] 스위프트와 Objective-C는 어느 API에서든 서로 사용할 수 있다. 모듈로 접근 가능한 Objective-C 프레임워크(또는 C 라이브러리)는 스위프트로 직접 가져올 수 있다.
```swift
import Foundation
```
초기화 예시:
Objective-C```objective-c
UITableView *myTableView =
```
스위프트```swift
let myTableView: UITableView = UITableView(frame: .zero, style: .Grouped)
```
Xcode 6 이후부터는 Objective-C와 스위프트의 상호 운용을 위한 브리지 헤더를 생성하는 기능이 제공된다. 브리지 헤더 파일이 생성되면 스위프트 측에서는 Objective-C 측에서 정의된 타입, 함수, 변수를 스위프트로 작성된 것처럼 참조할 수 있다.[133] Objective-C 측에서는 자동 생성된 헤더 파일을 임포트하여 스위프트 코드를 이용할 수 있다.[134] 단, 스위프트로 작성된 클래스를 Objective-C 측에서 서브클래싱하는 것은 불가능하다.[135]
4. 개발 환경
스위프트는 애플의 운영체제 (Darwin, iOS, iPadOS, macOS, tvOS, watchOS) 뿐만 아니라, 리눅스, 윈도우, 안드로이드 등 다양한 플랫폼을 지원한다.[51][52]
애플 플랫폼에서 스위프트 개발은 Xcode를 통해 이루어진다. Xcode는 코드 편집, 디버깅, Interface Builder를 이용한 UI 디자인, 빌드 및 배포 등 개발에 필요한 모든 기능을 제공하는 IDE이다. Xcode 6 이상에서는 Objective-C 코드를 스위프트에 노출하기 위한 '브리징 헤더' 기능을 제공하여, Objective-C와 스위프트 코드를 함께 사용할 수 있다.
플레이그라운드는 코드를 작성하고 실행 결과를 실시간으로 확인할 수 있는 대화형 개발 환경이다. Xcode 환경 또는 플레이그라운드 앱 내에서 실행되며, 코드 변경 사항에 즉시 응답한다. 플레이그라운드는 마크다운 문서를 포함할 수 있어 코드와 함께 설명을 추가하는 데 유용하다.
스위프트는 REPL을 지원하여 시스템 프로그래밍 언어보다 파이썬과 같은 스크립팅 언어와 유사한 대화형 개발 환경을 제공한다. 프로그래머는 콘솔이나 Xcode와 같은 IDE에서 LLDB를 사용하여 코드를 단계별로 실행하고 중단점을 추가할 수 있다.
스위프트는 서버 측 언어로도 사용될 수 있으며, IBM의 키투라(현재는 단종됨), Perfect, Vapor 등의 웹 프레임워크가 개발되었다. 애플은 공식 "서버 API" 워킹 그룹을 시작하여 스위프트 개발자 커뮤니티 구성원들이 서버 측 스위프트 개발에 참여하고 있다.[105][106]
RemObjects Software의 ''Elements 컴파일러''는 코코아, 마이크로소프트의 공용 언어 인프라 (.NET 프레임워크, 현재는 .NET), 자바, 안드로이드 플랫폼을 대상으로 하는 스위프트의 두 번째 자유로운 구현을 제공한다.[107]
Swift 2.2부터 우분투 배포판용 공식 다운로드를 사용할 수 있으며, Swift 5.2.4부터는 CentOS, Amazon Linux 등 더 많은 리눅스 배포판을 지원한다.[136]
2020년 5월 29일, AWS 람다에서 스위프트를 사용할 수 있도록 하는 "Swift AWS Lambda Runtime"이 공개되었다.[140]
참조
[1]
웹사이트
Swift Has Reached 1.0
https://developer.ap[...]
Apple
2014-09-09
[2]
특허
U.S. patent no. 9329844
[3]
웹사이트
Swift, Objectively
https://www.drdobbs.[...]
[4]
웹사이트
Re: [LLVMdev] [cfe-dev] [Advertisement] open positions in Apple's Swift compiler team
http://lists.cs.uiuc[...]
2014-06-11
[5]
웹사이트
Chris Lattner's Homepage
http://nondot.org/sa[...]
Chris Lattner
2014-06-03
[6]
웹사이트
Chris Lattner's Homepage
http://nondot.org/sa[...]
Chris Lattner
2014-06-03
[7]
웹사이트
Building assert() in Swift, Part 2: __FILE__ and __LINE__
https://developer.ap[...]
2014-09-25
[8]
웹사이트
Influences - The Rust Reference
https://doc.rust-lan[...]
null
[9]
웹사이트
influenced by - V documentation
https://github.com/v[...]
null
[10]
웹사이트
Apple Launches Swift, A New Programming Language For Writing iOS And OS X Apps
https://techcrunch.c[...]
2014-06-02
[11]
AV media
Protocol-oriented Programming in Swift
https://www.youtube.[...]
YouTube
[12]
웹사이트
Concepts are similar to Rust Traits
https://news.ycombin[...]
[13]
웹사이트
Tim Berners-Lee's sixtieth birthday Apple announces Swift, a new programming language for iOS
https://thenextweb.c[...]
2014-06-02
[14]
웹사이트
Apple's new programming language Swift is now open source
https://www.theverge[...]
2015-12-03
[15]
웹사이트
Apple Open Sources Swift in Latest Pitch to the Enterprise
https://blogs.wsj.co[...]
2015-12-03
[16]
웹사이트
Looking back on Swift 3 and ahead to Swift 4
https://forums.swift[...]
2016-07-29
[17]
웹사이트
Swift-Evolution
https://github.com/s[...]
[18]
웹사이트
The RedMonk Programming Language Rankings: January 2018 – tecosystems
https://redmonk.com/[...]
2018-03-07
[19]
웹사이트
Swift 5 Released!
https://swift.org/bl[...]
2019-03-25
[20]
웹사이트
Swift 5.1 Released!
https://swift.org/bl[...]
2019-09-20
[21]
웹사이트
What's new in Swift 5.5?
https://www.hackingw[...]
Hacking with Swift
2021-06-06
[22]
웹사이트
Swift 5.9 Released
https://swift.org/bl[...]
2023-09-18
[23]
웹사이트
Swift 5.10 Released
https://swift.org/bl[...]
2024-03-05
[24]
웹사이트
Swift.org
https://swift.org/
2014-03
[25]
웹사이트
Announcing Swift 6
https://www.swift.or[...]
2024-09-17
[26]
문서
Platforms State of the Union, Session 102, Apple Worldwide Developers Conference
2014-06-02
[27]
서적
The Swift Programming Language
https://itunes.apple[...]
Apple
2014-06-02
[28]
웹사이트
Swift Has Reached 1.0
https://developer.ap[...]
2014-09-09
[29]
웹사이트
Xcode 6.1 Release Notes
https://developer.ap[...]
2014-10-22
[30]
웹사이트
Xcode 6.3 Release Notes
https://developer.ap[...]
2015-04-08
[31]
웹사이트
Swift 2 Apps in the App Store
https://developer.ap[...]
[32]
뉴스
Swift 3.0 Released!
https://swift.org/bl[...]
2016-09-13
[33]
뉴스
Swift 4.0 Released!
https://swift.org/bl[...]
2017-09-17
[34]
뉴스
Swift 4.1 Released!
https://swift.org/bl[...]
2018-03-29
[35]
웹사이트
Stack Overflow Developer Survey Results 2015
https://stackoverflo[...]
[36]
웹사이트
Stack Overflow Developer Survey Results 2016
https://stackoverflo[...]
[37]
웹사이트
Swift.org and Open Source
https://swift.org/ab[...]
Apple Inc.
2019-02-25
[38]
웹사이트
Introducing the IBM Swift Sandbox — Swift
https://developer.ib[...]
2015-12-05
[39]
웹사이트
Write Swift code in a web browser with the IBM Swift Sandbox
https://9to5mac.com/[...]
2015-12-05
[40]
웹사이트
After Apple open sources it, IBM puts Swift programming in the cloud
https://www.zdnet.co[...]
2015-12-05
[41]
웹사이트
Swift Package Catalog and Swift Sandbox Deprecation
https://developer.ib[...]
2018-11-09
[42]
웹사이트
Swift Playgrounds
https://developer.ap[...]
2016-06-19
[43]
웹사이트
Swift Playgrounds — Preview
https://www.apple.co[...]
2016-06-19
[44]
웹사이트
Apple announces Swift Playgrounds for iPad at WWDC, public release in fall
https://9to5mac.com/[...]
2016-06-19
[45]
웹사이트
Longtime Apple programmer and Swift creator leaves Apple for Tesla
https://arstechnica.[...]
Ars Technica
2017-01-10
[46]
웹사이트
New Swift project head Ted Kremenek said to be running the show behind the scenes for some time
https://appleinsider[...]
AppleInsider
2017-01-13
[47]
웹사이트
WWDC19: SwiftUI was the brightest star in a galaxy of new ideas
https://appleinsider[...]
2019-07-19
[48]
웹사이트
Swift.org - Download Swift
https://swift.org/do[...]
2020-06-21
[49]
웹사이트
Android SDKs for Swift
https://github.com/b[...]
2021-09-10
[50]
웹사이트
swift-lang package versions
https://repology.org[...]
2021-09-10
[51]
웹사이트
Swift for Android: Our Experience and Tools
https://blog.readdle[...]
2020-08-20
[52]
웹사이트
Official tailored Swift for Windows support promised in 5.3: Swift on more platforms – provided you do not need a GUI
https://www.theregis[...]
2020-09-18
[53]
웹사이트
The Swift Linux Port
https://swift.org/bl[...]
Apple Inc
2016-08-03
[54]
웹사이트
A fast look at Swift, Apple's new programming language
https://arstechnica.[...]
Condé Nast
2014-06-05
[55]
웹사이트
Swift 5 Released!
https://swift.org/bl[...]
2019-03-28
[56]
웹사이트
Download Swift
https://swift.org/do[...]
Apple
2020-12-15
[57]
웹사이트
Swift 5.4 Released!
https://swift.org/bl[...]
Apple
2021-04-26
[58]
웹사이트
Swift 5.6 Released!
https://www.swift.or[...]
Apple
2022-03-14
[59]
웹사이트
Release Swift 5.6.1 Release · apple/Swift
https://github.com/s[...]
[60]
웹사이트
Release Swift 5.6.2 Release · apple/Swift
https://github.com/s[...]
[61]
웹사이트
Release Swift 5.6.3 Release · apple/Swift
https://github.com/s[...]
[62]
웹사이트
Swift 5.7 Released!
https://www.swift.or[...]
Apple
2022-09-12
[63]
웹사이트
Release Swift 5.7.1 Release · apple/Swift
https://github.com/s[...]
[64]
웹사이트
Release Swift 5.8 Release · apple/Swift
https://github.com/s[...]
[65]
웹사이트
Release Swift 5.8.1 Release · apple/swift
https://github.com/s[...]
2023-06-14
[66]
웹사이트
Release Swift 5.9 Release · apple/swift
https://github.com/s[...]
2023-09-18
[67]
웹사이트
Release Swift 5.9.1 Release · apple/swift
https://github.com/s[...]
2023-10-19
[68]
웹사이트
Release Swift 5.9.2 Release · apple/swift
https://github.com/s[...]
2023-12-11
[69]
웹사이트
Swift 5.10.1 Release
https://github.com/s[...]
2024-06-05
[70]
웹사이트
Swift 6.0 Release
https://github.com/s[...]
2024-09-17
[71]
웹사이트
Documentation
https://docs.swift.o[...]
2023-11-17
[72]
웹사이트
Eliminate data races using Swift Concurrency - WWDC22 - Videos
https://developer.ap[...]
Apple Inc
2023-11-17
[73]
웹사이트
Documentation
https://docs.swift.o[...]
2023-10-15
[74]
웹사이트
Documentation
https://docs.swift.o[...]
2023-10-15
[75]
웹사이트
Closures — The Swift Programming Language (Swift 5.5)
https://docs.swift.o[...]
2021-08-31
[76]
웹사이트
Multiple Trailing Closures
https://github.com/s[...]
2020-10-19
[77]
웹사이트
Documentation
https://docs.swift.o[...]
2023-10-16
[78]
웹사이트
Strings and Characters
https://docs.swift.o[...]
2023-10-16
[79]
웹사이트
Access Control
https://developer.ap[...]
Apple Inc.|Apple Developer
2016-10-25
[80]
웹사이트
Nullable Types
https://msdn.microso[...]
Microsoft
2017-02-21
[81]
웹사이트
Types
https://developer.ap[...]
Apple Inc.|Apple Developer
2014-07-16
[82]
웹사이트
Classes and Structures
https://developer.ap[...]
Apple Developer
[83]
웹사이트
Performance Case Study on Swift 1.1, Swift 1.2, and Objective-C
https://medium.com/@[...]
2015-02-14
[84]
AV media
Building Better Apps with Value Types
https://developer.ap[...]
Apple
[85]
웹사이트
Extensions
https://docs.swift.o[...]
2023-11-28
[86]
웹사이트
Working with Protocols
https://developer.ap[...]
Apple Developer Documentation Archive
2014-09-17
[87]
웹사이트
NSCopying Protocol Reference
https://developer.ap[...]
[88]
웹사이트
Swift standard library statistics
https://swiftinit.or[...]
Swiftinit
2023-10-02
[89]
웹사이트
Swift Default Protocol Implementations
https://nshipster.co[...]
2014-09-02
[90]
웹사이트
swift-evolution/proposals/0304-structured-concurrency.md at main · apple/swift-evolution
https://github.com/s[...]
2023-10-16
[91]
웹사이트
swift-evolution/proposals/0296-async-await.md at main · apple/swift-evolution
https://github.com/s[...]
2023-10-16
[92]
StackOverflow
Do Swift-based apps work on macOS 10.9/iOS 7 and lower?
https://stackoverflo[...]
[93]
웹사이트
Swift 5.9 Released
https://swift.org/bl[...]
2023-10-09
[94]
Apple Inc
Writing Swift Classes with Objective-C Behavior
https://developer.ap[...]
[95]
웹사이트
Migrating Your Objective-C Code to Swift
https://developer.ap[...]
[96]
Apple Inc
Swift and Objective-C in the Same Project
https://developer.ap[...]
[97]
웹사이트
Apple: search "corelib"
https://github.com/a[...]
[98]
웹사이트
Xcode - SwiftUI- Apple Developer
https://developer.ap[...]
2021-02-01
[99]
웹사이트
Intermediate Swift
https://developer.ap[...]
Apple
2014-07-03
[100]
간행물
Why Coders Are Going Nuts Over Apple's New Programming Language
https://www.wired.co[...]
2014-07-16
[101]
웹사이트
Error-Handling in Swift-Language
https://stackoverflo[...]
[102]
웹사이트
apple/swift-evolution
https://github.com/s[...]
2016-04-04
[103]
웹사이트
apple/swift-evolution
https://github.com/s[...]
2016-04-04
[104]
뉴스
IBM brings Swift to the cloud, releases web framework Kitura written in Apple's programming language
https://9to5mac.com/[...]
2016-05-16
[105]
뉴스
Server APIs Work Group
https://swift.org/bl[...]
2016-10-28
[106]
웹사이트
Swift.org
https://web.archive.[...]
2016-10-28
[107]
웹사이트
RemObjects Elements Compiler
https://www.elements[...]
2016-01-17
[108]
웹사이트
Swift for Arduino
https://www.swiftfor[...]
[109]
웹사이트
Swift on Mac OS 9
https://belkadan.com[...]
2020-04-01
[110]
Youtube
Protocol-oriented Programming in Swift
https://www.youtube.[...]
YouTube
[111]
문서
Chris Lattner's Homepage
http://nondot.org/sa[...]
2020-06-24
[112]
문서
Swift Has Reached 1.0 - Swift Blog - Apple Developer
https://developer.ap[...]
[113]
문서
Swift.org - Welcome to Swift.org
https://swift.org
[114]
문서
Swift Playgrounds、App Storeで提供開始
http://www.apple.com[...]
[115]
문서
Swift Playgrounds、さらに5か国語に対応
http://www.apple.com[...]
[116]
문서
Swift 3.1 Released! - swoft.org
https://swift.org/bl[...]
2017-03-27
[117]
문서
'[swift-evolution] Update on the Swift Project Lead'
https://lists.swift.[...]
2017-01-10
[118]
문서
Swift 4.0 Released! - Ted Kremenek
https://swift.org/bl[...]
2017-09-19
[119]
웹사이트
「Xcode」をMac App Storeで
https://apps.apple.c[...]
2018-04-02
[120]
웹사이트
Xcode 10
https://developer.ap[...]
2018-06-12
[121]
웹사이트
'Swift.org - Swift 5 Released!'
https://swift.org/bl[...]
2020-03-18
[122]
웹사이트
'Introducing SwiftUI: Building Your First App - WWDC 2019 - Videos - Apple Developer'
https://developer.ap[...]
2020-03-23
[123]
웹사이트
'Swift.org - Swift 5.1 Released!'
https://swift.org/bl[...]
2020-11-02
[124]
웹사이트
'Swift.org - Swift 5.2 Released!'
https://swift.org/bl[...]
2020-11-25
[125]
웹사이트
'Swift.org - Swift 5.3 released!'
https://swift.org/bl[...]
2021-04-13
[126]
웹사이트
Introducing Swift on Windows
https://swift.org/bl[...]
2020-11-02
[127]
웹사이트
What's new in Swift 5.5?
https://www.hackingw[...]
Hacking with Swift
2021-06-06
[128]
웹사이트
'Swift.org - Swift 5.10 Released'
https://www.swift.or[...]
2024-04-11
[129]
웹사이트
'Swift.org - Announcing Swift 6'
https://www.swift.or[...]
2024-12-20
[130]
웹사이트
Swiftとは?フリーランスの仕事内容や年収、案件を獲得するための方法を解説!
https://x-hours.com/[...]
1970-01-01
[131]
웹사이트
'Automatic Reference Counting — The Swift Programming Language (Swift 5.2)'
https://docs.swift.o[...]
2020-05-25
[132]
웹사이트
Using Swift with Cocoa and Objective-C
https://developer.ap[...]
Apple Inc.
2014-09-02
[133]
웹사이트
Importing Objective-C into Swift | Apple Developer Documentation
https://developer.ap[...]
Apple Inc.
2020-06-22
[134]
웹사이트
Importing Swift into Objective-C | Apple Developer Documentation
https://developer.ap[...]
Apple Inc.
2020-06-22
[135]
웹사이트
Migrating Your Objective-C Code to Swift | Apple Developer Documentation
https://developer.ap[...]
Apple Inc.
2020-06-22
[136]
웹사이트
Swift.org - Download Swift
https://swift.org/do[...]
2020-11-02
[137]
웹사이트
IBM brings Swift to the cloud, releases web framework Kitura written in Apple’s programming language
https://9to5mac.com/[...]
2020-03-23
[138]
뉴스
Server APIs Work Group
https://swift.org/bl[...]
2020-05-25
[139]
웹사이트
Swift for Android: Our Experience and Tools | Blog
https://readdle.com/[...]
2021-03-24
[140]
뉴스
Swift.org - Introducing Swift AWS Lambda Runtime
https://swift.org/bl[...]
2020-09-24
[141]
웹인용
Swift 5.6 Release Process
https://forums.swift[...]
2021-11
[142]
웹인용
Apple announces Swift, a new programming language for iOS
http://thenextweb.co[...]
[143]
웹인용
Apple announces new Xcode, ‘Swift’ programming language
http://9to5mac.com/2[...]
[144]
서적
The Swift Programming Language
https://itunes.apple[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com