스위프트(프로그래밍 언어)
Swift (programming language)패러다임 | 다중 패러다임: 프로토콜 지향, 객체 지향, 기능 지향, 명령형, 블록 구조화, 선언형, 동시형 |
---|---|
설계자 | Chris Latner, Doug Gregor, John McCall, Ted Cremenek, Joe Groff, 그리고 Apple Inc.[1] |
개발자 | Apple Inc. 및 오픈 소스 기여자 |
첫 등장 | 2014년 6월 2일;[2] | 전 (
안정적인 방출 | 5.9.1[3] / 2023년 10월 19일, 전 |
미리보기출고 | 5.9 |
타이핑 규율 | 정적, 강한, 추론된 |
기억관리 | 자동 기준 카운트 |
OS | Apple의 운영 체제(Darwin, iOS, iPadOS, macOS, tvOS, watch)OS), 리눅스, 윈도우 10, 안드로이드 |
면허증. | Apache License 2.0 (Swift 2.2 이상) 독점(Swift 2.2까지)[4][5] |
파일 확장자 | .swift..스위프트 |
웹사이트 | |
영향을 받음 | |
목표- C,[6] Rust, Haskell, Ruby, Python, C#, CLU[8],[7] D | |
영향받은 | |
Rust,[9] V (Vlang)[10] |
Swift는 Apple Inc.와 오픈 소스 커뮤니티가 개발한 높은 수준의 범용 멀티패러다임, 컴파일된 프로그래밍 언어입니다. 스위프트는 LLVM 기반 컴파일러이기 때문에 기계 코드로 컴파일됩니다. 스위프트는 2014년 6월에 처음 출시되었으며 [11]스위프트 툴체인은 2014년에 출시된 버전 6부터 Xcode로 출시되었습니다.
애플은 스위프트가 목표-C와 관련된 많은 핵심 개념들, 특히 동적인 디스패치, 광범위한 후기 바인딩, 확장 가능한 프로그래밍 및 유사한 기능들을 지원하기를 원했지만, "더 안전한" 방식으로, 소프트웨어 버그를 더 쉽게 파악할 수 있도록 스위프트는 널 포인터 참조 취소와 같은 일반적인 프로그래밍 오류를 해결하는 기능을 갖추고 있으며, 종말의 피라미드를 피할 수 있도록 구문 설탕을 제공합니다. Swift는 유형, 구조 및 클래스에 적용할 수 있는 확장성 시스템인 프로토콜 확장성의 개념을 지원합니다. 이 시스템은 Apple이 "프로토콜 지향 프로그래밍"[12]이라고 부르는 프로그래밍 패러다임의 실제 변화라고 홍보합니다(특성 및 유형 클래스와 유사).[13]
스위프트는 애플의 2014 세계 개발자 회의(WWDC)에서 소개되었습니다.[14] 2014년에 버전 1.2로 업그레이드되었으며 WWDC 2015에서 Swift 2로 대대적인 업그레이드를 거쳤습니다. 초기에 독점 언어였던 버전 2.2는 2015년 12월 3일 아파치 라이선스 2.0으로 애플의 플랫폼과 리눅스용 오픈 소스 소프트웨어로 만들어졌습니다.[15][16]
버전 3.0을 통해 Swift의 구문은 상당한 발전을 이루었고, 코어 팀은 소스 안정성에 초점을 두게 되었습니다.[17][18] 2018년 1분기에 Swift는 측정된 인기에서 Object-C를 앞질렀습니다.[19]
2017년에 출시된 Swift 4.0은 일부 내장 클래스 및 구조에 몇 가지 변경 사항을 도입했습니다. 이전 버전의 Swift로 작성된 코드는 Xcode에 내장된 마이그레이션 기능을 사용하여 업데이트할 수 있습니다. 2019년 3월에 출시된 스위프트 5는 애플 플랫폼에 안정적인 이진 인터페이스를 도입하여 스위프트 런타임을 애플 운영 체제에 통합할 수 있도록 했습니다. 스위프트 4와 호환되는 소스입니다.[20]
스위프트 5.1은 2019년 9월에 공식 출시되었습니다. Swift 5.1은 모듈 안정성의 도입으로 언어의 안정적인 기능을 컴파일 타임으로 확장하여 이전 버전의 Swift 5를 기반으로 구축됩니다. 모듈 안정성의 도입으로 향후 Swift의 릴리스와 함께 작동할 이진 프레임워크를 생성하고 공유할 수 있습니다.[21]
애플이 2021년 WWDC에서 공식 발표한 Swift 5.5는 동시성 및 비동기 코드에 대한 언어 지원을 크게 확장하며, 특히 배우 모델의 독특한 버전을 선보입니다.[22]
현재 버전인 Swift 5.9는 2023년 9월에 출시되었으며 매크로 시스템, 일반 파라미터 팩 및 새로운 것과 같은 소유 기능을 포함합니다. consume
연산자[23]
역사
스위프트의 개발은 2010년 7월 Chris Latner에 의해 시작되었고, 결국 애플의 다른 많은 프로그래머들의 협력으로 시작되었습니다. 스위프트는 1980년대 초부터 거의 변하지 않고 현대 언어 기능이 부족했던 애플의 초기 프로그래밍 언어 오브젝티브-C를 대체할 필요성에 동기를 부여받았습니다. Swift는 "Objective-C, Rust, Haskell, Ruby, Python, C#, CLU 등에서 언어 아이디어를 얻었습니다."[7] 2014년 6월 2일, 애플 월드와이드 개발자 회의(WWDC) 애플리케이션은 스위프트로 작성된 최초의 공개 앱이 되었습니다.[24] 컨퍼런스에서 등록된 애플 개발자들에게 프로그래밍 언어의 베타 버전이 공개되었지만, 회사는 스위프트의 최종 버전이 테스트 버전과 호환되는 소스 코드가 될 것이라고 약속하지 않았습니다. 애플은 풀 릴리즈에 필요한 경우 소스 코드 변환기를 사용할 수 있도록 할 계획이었습니다.[24]
500페이지 분량의 무료 매뉴얼인 스위프트 프로그래밍 언어도 WWDC에서 공개되었으며, 애플 북스 스토어와 공식 웹사이트에서 이용할 수 있습니다.[25]
2014년 9월 9일, Swift는 iOS용 Xcode 6.0의 Gold Master로 1.0 마일스톤에 도달했습니다.[26] 스위프트 1.1은 엑스코드 6.1의 출시와 함께 2014년 10월 22일에 출시되었습니다.[27] 스위프트 1.2는 2015년 4월 8일에 Xcode 6.3과 함께 출시되었습니다.[28] Swift 2.0은 WWDC 2015에서 발표되었으며 2015년 9월 21일 앱스토어에서 앱을 게시할 수 있게 되었습니다.[29] 스위프트 3.0은 2016년 9월 13일에 출시되었습니다.[30] 스위프트 4.0은 2017년 9월 19일에 출시되었습니다.[31] 스위프트 4.1은 2018년 3월 29일에 출시되었습니다.[32]
Swift는 Stack Overflow Developer Survey 2015에서[33] Most Loveed Programming Language로 1위를 차지했고, 2016년에는 2위를 차지했습니다.[34]
2015년 12월 3일, 스위프트 언어, 지원 라이브러리, 디버거, 패키지 매니저가 런타임 라이브러리 예외와 함께 아파치 2.0 라이선스로 오픈 sourced 되었고, 프로젝트를 주최하기 위해 Swift.org 가 만들어졌습니다. 소스 코드는 GitHub에서 호스팅되며, 누구나 쉽게 코드를 받아 직접 구축하고 심지어 프로젝트에 코드를 다시 기여하기 위해 풀 요청을 생성할 수 있습니다.
2015년 12월, IBM은 개발자들이 한 창에 스위프트 코드를 쓰고 다른 창에 출력을 표시할 수 있는 스위프트 샌드박스 웹사이트를 발표했습니다.[36][37][38] 스위프트 샌드박스는 2018년 1월에 가치가 떨어졌습니다.[39]
2016년 WWDC에서 애플은 사람들에게 스위프트로 코딩하는 방법을 가르치기 위한 스위프트 플레이그라운드라는 이름의 아이패드 전용 앱을 발표했습니다. 이 앱은 코드 라인이 특정 순서로 배치되고 실행되면 피드백을 제공하는 3D 비디오 게임과 같은 인터페이스로 제공됩니다.[40][41][42]
2017년 1월, 크리스 래트너는 테슬라 모터스의 새로운 직책을 위해 애플을 떠나는 것을 발표했고, 스위프트 프로젝트의 주연은 베테랑 테드 크레메넥에게 맡겼습니다.[43][44]
2019년 WWDC에서 애플은 스위프트를 발표했습니다.모든 애플 플랫폼에 걸쳐 선언적 UI 구조 설계를 위한 프레임워크를 제공하는 Xcode 11이 탑재된 UI.[45]
우분투 리눅스 배포판의 공식 다운로드는 스위프트 2.2 이후로 이용할 수 있으며, 스위프트 5.2.4, 센트OS, 아마존 리눅스 이후로 더 많은 디스트로스가 추가되었습니다.[46] 안드로이드용 비공식 SDK와 네이티브 툴체인 패키지도 있습니다.[47][48]
플랫폼
Swift가 지원하는 플랫폼은 Apple의 운영 체제(Darwin, iOS, iPadOS, macOS, tvOS, watch)입니다.OS), Linux, Windows 및 Android.[49][50]
Swift의 디자인의 핵심적인 측면은 지난 수십 년 동안 Apple 제품을 위해 개발된 기존의 Object-C 코드의 거대한 본체(예: 코코아 및 코코아 터치 프레임워크)와 상호 운용할 수 있는 능력입니다. 애플 플랫폼에서는 [51]C, C, C++, 스위프트 코드를 하나의 프로그램 내에서 실행할 수 있도록 하는 Objective-C 런타임 라이브러리와 링크됩니다.[52]
버전이력
버전 | 출시일 | macOS | 리눅스 | 창문들 |
---|---|---|---|---|
스위프트 1.0 | 2014년9월9일 | 네. | 아니요. | 아니요. |
스위프트 1.1 | 2014년10월22일 | 네. | 아니요. | 아니요. |
스위프트 1.2 | 2015년4월8일 | 네. | 아니요. | 아니요. |
스위프트 2.0 | 2015년9월21일 | 네. | 아니요. | 아니요. |
스위프트 2.1 | 2015년10월20일 | 네. | 아니요. | 아니요. |
스위프트 2.2 | 2016년3월21일 | 네. | 네. | 아니요. |
스위프트 2.2.1 | 2016년5월3일 | 네. | 네. | 아니요. |
스위프트 3.0 | 2016년9월13일 | 네. | 네. | 아니요. |
스위프트 3.0.1 | 2016년10월28일 | 네. | 네. | 아니요. |
스위프트 3.0.2 | 2016년12월13일 | 네. | 네. | 아니요. |
스위프트 3.1 | 2017년3월27일 | 네. | 네. | 아니요. |
스위프트 3.1.1 | 2017년4월21일 | 네. | 네. | 아니요. |
스위프트 4.0 | 2017년9월19일 | 네. | 네. | 아니요. |
스위프트 4.0.2 | 2017년11월1일 | 네. | 네. | 아니요. |
스위프트 4.0.3 | 2017년 12월 5일 | 네. | 네. | 아니요. |
스위프트 4.1 | 2018년3월29일 | 네. | 네. | 아니요. |
스위프트 4.1.1 | 2018년5월4일 | 아니요. | 네. | 아니요. |
스위프트 4.1.2 | 2018년5월31일 | 네. | 네. | 아니요. |
스위프트 4.1.3 | 2018년7월27일 | 아니요. | 네. | 아니요. |
스위프트 4.2 | 2018년9월17일 | 네. | 네. | 아니요. |
스위프트 4.2.1 | 2018년10월30일 | 네. | 네. | 아니요. |
스위프트 4.2.2 | 2019년2월4일 | 아니요. | 네. | 아니요. |
스위프트 4.2.3 | 2019년 2월 28일 | 아니요. | 네. | 아니요. |
스위프트 4.2.4 | 2019년3월29일 | 아니요. | 네. | 아니요. |
스위프트 5.0[53] | 2019년3월25일 | 네. | 네. | 아니요. |
스위프트 5.0.1 | 2019년4월18일 | 네. | 네. | 아니요. |
스위프트 5.0.2 | 2019년7월15일 | 아니요. | 네. | 아니요. |
스위프트 5.0.3 | 2019년8월30일 | 아니요. | 네. | 아니요. |
스위프트 5.1 | 2019년9월10일 | 네. | 네. | 아니요. |
스위프트 5.1.1 | 2019년10월11일 | 아니요. | 네. | 아니요. |
스위프트 5.1.2 | 2019년11월7일 | 네. | 네. | 아니요. |
스위프트 5.1.3 | 2019년 12월 13일 | 네. | 네. | 아니요. |
스위프트 5.1.4 | 2020년 1월 31일 | 아니요. | 네. | 아니요. |
스위프트 5.1.5 | 2020년3월9일 | 아니요. | 네. | 아니요. |
스위프트 5.2 | 2020년3월24일 | 네. | 네. | 아니요. |
스위프트 5.2.1 | 2020년3월30일 | 아니요. | 네. | 아니요. |
스위프트 5.2.2 | 2020년4월15일 | 네. | 네. | 아니요. |
스위프트 5.2.3 | 2020년4월29일 | 아니요. | 네. | 아니요. |
스위프트 5.2.4 | 2020년 5월 20일 | 네. | 네. | 아니요. |
스위프트 5.2.5 | 2020년 8월 5일 | 아니요. | 네. | 아니요. |
스위프트 5.3 | 2020년9월16일 | 네. | 네. | 네[54] |
스위프트 5.3.1 | 2020년11월13일 | 네. | 네. | 네. |
스위프트 5.3.2 | 2020년12월15일 | 네. | 네. | 네. |
스위프트 5.3.3 | 2021년 1월 25일 | 아니요. | 네. | 네. |
스위프트 5.4[55] | 2021년4월26일 | 네. | 네. | 네. |
스위프트 5.4.1 | 2021년 5월 25일 | 아니요. | 네. | 네. |
스위프트 5.4.2 | 2021년 6월 28일 | 네. | 네. | 네. |
스위프트 5.4.3 | 2021년9월9일 | 아니요. | 네. | 네. |
스위프트 5.5 | 2021년9월20일 | 네. | 네. | 네. |
스위프트 5.5.1 | 2021년10월27일 | 네. | 네. | 네. |
스위프트 5.5.2 | 2021년 12월 14일 | 네. | 네. | 네. |
스위프트 5.5.3 | 2022년 2월 9일 | 아니요. | 네. | 네. |
스위프트 5.6[56] | 2022년3월14일 | 네. | 네. | 네. |
스위프트 5.6.1[57] | 2022년4월9일 | 아니요. | 네. | 네. |
스위프트 5.6.2[58] | 2022년 6월 15일 | 아니요. | 네. | 네. |
스위프트 5.6.3[59] | 2022년9월2일 | 아니요. | 네. | 네. |
스위프트 5.7[60] | 2022년9월12일 | 네. | 네. | 네. |
스위프트 5.7.1[61] | 2022년11월1일 | 네. | 네. | 네. |
스위프트 5.8[62] | 2023년3월30일 | 네. | 네. | 네. |
스위프트 5.8.1[63] | 2023년6월1일 | 네. | 네. | 네. |
스위프트 5.9[64] | 2023년9월18일 | 네. | 네. | 네. |
특징들
이 섹션은 대부분의 독자가 이해하기에는 너무 기술적일 수 있습니다.(2018년 6월) (본 및 에 대해 |
스위프트(Swift)는 현대 프로그래밍 언어 이론 개념을 사용하고 단순하면서도 강력한 구문을 제시하기 위해 노력하는 범용 프로그래밍 언어입니다. Swift는 애플 플랫폼의 주요 개발 언어로 대체된 Object-C에서 주목할 만한 영감을 얻어 다양한 프로그래밍 언어의 혁신과 규칙을 통합합니다.
스위프트는 속도를 희생하지 않으면서도 새로운 프로그래머들에게 안전하고 친근하게 다가갈 수 있도록 설계되었습니다. 기본적으로 Swift는 모든 메모리를 자동으로 관리하고 변수를 사용하기 전에 항상 초기화합니다. 어레이 액세스에서 경계를 벗어난 오류가 있는지 확인하고 정수 작업에서 오버플로가 있는지 확인합니다. 파라미터 이름을 사용하면 명확한 API를 만들 수 있습니다. 프로토콜은 유형이 채택할 수 있는 인터페이스를 정의하는 반면, 확장 기능은 개발자가 기존 유형에 기능을 추가할 수 있도록 합니다. Swift는 클래스, 하위 유형화 및 메서드 재정의를 지원하여 개체 지향 프로그래밍을 활성화합니다. 옵션을 사용하면 nil 값을 명시적이고 안전하게 처리할 수 있습니다. 동시 프로그램은 비동기/대기 구문을 사용하여 작성할 수 있으며 행위자는 데이터 레이스를 제거하기 위해 공유된 가변 상태를 격리합니다.[65][66]
기본 구문
스위프트의 구문은 C 스타일 언어와 비슷합니다. 코드는 기본적으로 전역 범위에서 실행되기 시작합니다.[67] 또는, @main
특성은 구조, 클래스 또는 열거 선언을 적용하여 프로그램의 진입점을 포함하고 있음을 나타낼 수 있습니다.[68]
스위프트의 "Hello, World!" 프로그램은 다음과 같습니다.
활자로 인쇄하다("안녕, 세상!")
그 print(_:separator:terminator:)
여기에 사용되는 기능은 외부 모듈을 가져올 필요 없이 모든 프로그램에서 사용할 수 있는 Swift의 표준 라이브러리에 포함되어 있습니다. Swift의 문은 세미콜론으로 끝날 필요는 없지만, 세미콜론은 동일한 행에 작성된 여러 문을 구분해야 합니다. 한 줄 댓글은 다음으로 시작합니다. //
그리고 현재 줄이 끝날 때까지 계속합니다. 여러 줄의 코멘트는 다음에 포함됩니다. /*
그리고. */
성격. 상수는 다음과 같이 선언됩니다. let
키워드 및 변수를 사용합니다. var
키워드 값을 읽기 전에 초기화해야 합니다. 값은 제공된 초기 값의 유형에 따라 유형을 추론할 수 있습니다. 값 선언 후에 초기 값이 설정된 경우 유형을 명시적으로 선언해야 합니다.[69]
허락하다 고득점임계값 = 1000 // Int를 입력한 상수입니다. 제공된 값을 기준으로 유형을 추론했습니다. 바아 커런트스코어 = 980 // Int를 입력한 변수입니다. 커런트스코어 = 1200 // 변수 값은 시간에 따라 변경될 수 있습니다. 허락하다 플레이어 메시지: 끈 // String을 명시적으로 입력한 상수입니다. 한다면 커런트스코어 > 고득점임계값 { 플레이어 메시지 = "당신은 최고의 선수입니다!" } 또 다른 { 플레이어 메시지 = "다음에는 행운을 빌어요." } 활자로 인쇄하다(플레이어 메시지) // "당신은 최고의 선수입니다!"라고 인쇄합니다.
Swift의 제어 흐름은 if-else, guard 및 switch 문과 함께 while 및 for-in 루프로 관리됩니다. 문이 부울 매개변수를 사용하여 조건이 참이면 if 문의 본문을 실행하고, 그렇지 않으면 옵션을 실행합니다. else
몸. if-let
구문은 선택적인 값의 존재를 확인하고 동시에 포장을 풀기 위한 구문 설탕을 제공합니다.
허락하다 어떤 숫자 = 42 한다면 어떤 숫자 % 2 == 0 { // 나머지 연산자를 사용하여 일부 숫자의 나머지를 2로 나눈 값을 구합니다. 활자로 인쇄하다("\(어떤 숫자) 짝수입니다.") } 또 다른{ 활자로 인쇄하다("\(어떤 숫자) 이상합니다.") } // "42는 짝수"라고 인쇄합니다.
기능은 다음과 같이 정의됩니다.
키워드 함수 매개변수는 함수 호출이 구와 같이 읽을 수 있도록 하는 이름을 가질 수 있습니다. 매개 변수 이름 앞에 밑줄을 사용하면 인수 레이블을 호출 사이트에서 생략할 수 있습니다. 튜플은 여러 데이터를 한 번에 반환하는 기능을 사용할 수 있습니다.func
재미있는 인사말을 작성합니다.(위해서 이름.: 끈) -> 끈 { 돌아가다 "안녕하세요. \(이름.)!" } 허락하다 인사 = 인사말을 작성합니다.(위해서: "크레이그") 활자로 인쇄하다(인사) // "안녕 크레이그!"라고 인쇄합니다.
폐쇄로 알려진 함수 및 익명 함수는 속성에 할당할 수 있으며 다른 값과 마찬가지로 프로그램 주변을 전달할 수 있습니다.
재미있는 둘로 나누기(_ a Num: 인트) -> 인트 { 돌아가다 a Num / 2 } 재미있는 곱하기 2(_ a Num: 인트) -> 인트 { 돌아가다 a Num * 2 } 허락하다 수학 연산 = 곱하기 2 활자로 인쇄하다(수학 연산(21)) // "42" 인쇄
문장은 다음과 같이 계속하기 전에 주어진 조건이 참이어야 합니다. guard
성명서, 그렇지 않은 경우 제공된 본문 guard
절이 실행되었습니다. 그 else
절은 다음이 포함된 코드 블록의 제어를 종료해야 합니다. else
문이 나타납니다. guard
문은 프로그램 실행을 계속하기 전에 특정 요구 사항을 충족하는지 확인하는 데 유용합니다. 특히 나머지 엔클로저 범위에 대해 non-nil이 보장되는 옵션 값의 언랩 버전을 만드는 데 사용할 수 있습니다.guard
재미있는 나누다(분자: 인트?, 분임자별로 분모: 인트) -> 인트? { 보초를 서는 분모 != 0 또 다른 { 활자로 인쇄하다("0으로 나눌 수 없습니다.") 돌아가다 영의 } 보초를 서는 허락하다 분자 또 다른 { 활자로 인쇄하다("제공된 분자는 0입니다.") 돌아가다 영의 } 돌아가다 분자 / 분모 } 허락하다 결과 = 나누다(분자: 3, 분임자별로: 0) 활자로 인쇄하다("분할 결과는 다음과 같습니다. \(결과)") // 인쇄: // "0으로 나눌 수 없습니다." // "나눗셈 결과는 0."
switch
문은 값을 여러 개의 전위 값과 비교한 다음 관련 코드 블록을 실행합니다. switch
모든 가능한 값에 대한 대소문자를 포함하거나 다음을 포함하여 문장을 완전하게 만들어야 합니다. default
제공된 값이 다른 케이스와 일치하지 않을 때 실행되는 케이스입니다. switch
사례는 명시적으로 다음과 같이 할 수 있지만 암묵적으로 해당되지 않습니다. fallthrough
키워드 패턴 매칭은 내부에서 다양하게 활용 가능합니다. switch
진술들. 다음은 정수가 다수의 전위 범위와 일치하는 예입니다.
허락하다 어떤 숫자 = 42 스위치를 돌리다 어떤 숫자 { 사례. ..<0: 활자로 인쇄하다("\(어떤 숫자) 부정적입니다.") 사례. 0: 활자로 인쇄하다("\(어떤 숫자) 0입니다.") 사례. 1...9: 활자로 인쇄하다("\(어떤 숫자) 0보다 크지만 10보다 작습니다.") 체납: 활자로 인쇄하다("\(어떤 숫자) 9보다 큽니다.") } // "42가 9보다 큽니다."
for-in
루프는 일련의 값에 대해 반복됩니다.
허락하다 이름들 = ["윌", "안나", "바트"] 위해서 이름. 안에 이름들 { 활자로 인쇄하다(이름.) } // 인쇄: // 윌 // 안나 // 바트
while
주어진 부울 조건이 다음을 평가하는 한 루프가 반복됩니다. true
:
// 1부터 5까지의 숫자를 모두 합하세요. 바아 i = 1 바아 결과 = 0 하는 동안에 i <= 5 { // 루프는 i가 5 이하인 한 몸을 수행합니다. 결과 += i // 현재 결과에 i를 추가합니다. i += 1 // i를 1씩 늘립니다. } 활자로 인쇄하다(결과) // "15" 인쇄
폐업지원
Swift는 코드로 전달하고 사용할 수 있는 자체 기능 블록인 클로저를 지원하며 [70]익명 기능으로도 사용할 수 있습니다. 다음은 몇 가지 예입니다.
// 입력 및 출력 값으로 정의되는 폐쇄 유형은 폐쇄 외부에서 지정할 수 있습니다. 허락하다 클로저1: (인트, 인트) -> 인트 = { arg1, arg2 안에 돌아가다 arg1 + arg2 } // …또는 그 안에: 허락하다 클로저2 = { (arg1: 인트, arg2: 인트) -> 인트 안에 돌아가다 arg1 + arg2 } // 대부분의 경우 클로저의 반환 유형은 컴파일러에 의해 자동으로 추론될 수 있습니다. 허락하다 클로저3 = { arg1: 인트, arg2: 인트 안에 돌아가다 arg1 + arg2 }
닫힘은 변수와 상수에 할당될 수 있으며 매개 변수로 다른 함수나 닫힘으로 전달될 수 있습니다. 단일 식으로 닫으면 다음이 삭제될 수 있습니다. return
키워드
Swift는 또한 함수의 매개 변수 목록 내에서가 아니라 함수 호출 종료 후에 클로저를 작성할 수 있는 후행 클로저 구문도 가지고 있습니다. 폐쇄가 함수의 유일한 매개 변수인 경우 괄호를 모두 생략할 수 있습니다.
// 이 함수는 입력 파라미터를 받지 않고 정수를 반환하는 클로저를 사용합니다. // 이 값을 평가하고 폐쇄의 반환 값(Int)을 함수의 반환 값으로 사용합니다. 재미있는 푸우(폐쇄적인 바: () -> 인트) -> 인트 { 돌아가다 바() } // 후행 폐쇄 구문 없음: 푸우(폐쇄적인: { 돌아가다 1 }) // 후행 폐쇄 구문 및 암묵적 반환 포함: 푸우 { 1 }
버전 5.3부터 Swift는 다중 후행 폐쇄를 지원합니다.[71]
// 이 함수는 첫 번째 폐쇄의 반환을 두 번째 폐쇄의 매개변수로 전달합니다. // 그리고 두 번째 닫힘의 결과를 반환합니다. 재미있는 푸우(바: () -> 인트, 허튼소리: (인트) -> 인트) -> 인트 { 돌아가다 허튼소리(바()) } // 후미 폐쇄 없음: 푸우(바: { 돌아가다 1 }, 허튼소리: { x 안에 돌아가다 x + 1 }) // 트레일링 클로저 1개 포함: 푸우(바: { 돌아가다 1 }) { x 안에 돌아가다 x + 1 } // 후행 폐쇄가 2개인 경우(첫 번째 폐쇄의 인수 이름만 생략됨): 푸우 { 돌아가다 1 } 허튼소리: { x 안에 돌아가다 x + 1 }
Swift는 인라인 클로저에 대한 약어 인수 이름을 제공하여 모든 클로저 매개 변수의 이름을 명시적으로 지정할 필요가 없습니다.[72] 인수는 $0, $1, $2 등의 이름으로 참조할 수 있습니다.
허락하다 이름들 = ["요세핀", "스티브", "크리스", "바바라"] // filter는 이름의 각 값에 대해 지정된 닫힘을 호출합니다. // 문자 수가 6개 미만인 값은 유지되고 나머지는 삭제됩니다. 허락하다 짧은 이름 = 이름들.거름망을 치다 { $0.세어보세요 < 6 } 활자로 인쇄하다(짧은 이름) // 프린트 "["스티브", "크리스"]"
폐쇄는 주변 범위에서 값을 캡처할 수 있습니다. 폐쇄는 폐쇄가 존재하는 동안 캡처된 이 값을 나타냅니다.
재미있는 곱셈기를 만들다(다중으로 복수의: 인트) -> (인트) -> (인트) { // Int를 입력하고 입력에 배수를 곱한 값을 반환하는 폐쇄를 생성하고 반환합니다. 돌아가다 { $0 * 복수의 } } 허락하다 승수의 = 곱셈기를 만들다(다중으로: 3) 활자로 인쇄하다(승수의(3)) // "9" 인쇄 활자로 인쇄하다(승수의(10)) // "30" 인쇄
스트링 서포트
스위프트 표준 라이브러리에는 유니코드 호환성이 포함되어 있습니다. String
그리고. Character
종류들. 문자열 값은 큰따옴표로 둘러싸인 문자 시퀀스인 문자열 리터럴을 사용하여 초기화할 수 있습니다. 문자열은 다음과 연결할 수 있습니다. +
연산자:
바아 어떤 끈 = "안녕하세요" 어떤 끈 += " 세상!"
문자열 보간을 사용하면 다른 값과 식을 사용하여 새 문자열을 만들 수 있습니다. 괄호 사이에 쓰여진 값 뒤에 a가 붙습니다. \
에 다음과 같은 문자열이 삽입됩니다.[73]
바아 커런트스코어 = 980 활자로 인쇄하다("당신의 점수는. \(커런트스코어).") // "당신의 점수는 980점입니다."라고 인쇄합니다.
입력 루프를 사용하여 문자열에 포함된 문자를 반복할 수 있습니다.
위해서 성격 안에 "스위프트" { 활자로 인쇄하다(성격) } // 스 // w // 아이 // ㅂ // t
Foundation Framework를 Swift가 가져올 때 Original-C에서 일반적으로 사용되는 String 클래스인 String 유형을 NSString으로 보이지 않게 브리지합니다.
호출 가능한 개체
Swift에서 호출 가능한 개체는 다음을 사용하여 정의됩니다. callAsFunction
.[74]
짜임새 있는 호출 가능한 구조 { 바아 가치: 인트 재미있는 함수로서의 호출(_ 번호: 인트, 규모.: 인트) { 활자로 인쇄하다(규모. * (번호 + 가치)) } } 허락하다 호출할 수 있는 = 호출 가능한 구조(가치: 100) 호출할 수 있는(4, 규모.: 2) 호출할 수 있는.함수로서의 호출(4, 규모.: 2) // 두 기능 호출 모두 인쇄 208입니다.
출입통제
Swift는 기호에 대한 5가지 접근 제어 수준을 지원합니다. open
, public
, internal
, fileprivate
,그리고. private
. 많은 객체 지향 언어와 달리 액세스 제어는 상속 계층을 무시합니다. private
기호는 바로 옆 범위에서만 접근할 수 있음을 나타냅니다. fileprivate
파일 내에서만 액세스할 수 있음을 나타냅니다. internal
저장 모듈 내에서 접근할 수 있음을 나타냅니다. public
모든 모듈에서 액세스할 수 있음을 나타냅니다. open
(클래스 및 해당 메서드에 한해서만) 클래스가 모듈 외부에서 서브클래스될 수 있음을 나타냅니다.[75]
옵션 및 체인 연결
스위프트의 중요한 기능은 옵션 유형으로, 참조 또는 값이 C의 일반적인 패턴과 유사한 방식으로 작동할 수 있습니다. 여기서 포인터는 특정 값을 가리킬 수도 있고 아예 값이 없을 수도 있습니다. 이는 옵션이 아닌 유형은 널 포인터 오류를 발생시킬 수 없음을 의미합니다. 컴파일러는 이것이 불가능함을 보장할 수 있습니다.
옵션 유형은 다음과 같이 생성됩니다. Optional
num. null을 사용할 수 없는 정수를 만들려면 다음과 유사한 선언을 사용합니다. var optionalInteger: Optional<Int>
. 스위프트는 C#[76]과 마찬가지로 이를 위한 통사당도 포함하고 있어 유형명 뒤에 물음표를 붙여 변수가 선택사항임을 나타낼 수 있습니다. var optionalInteger: Int?
.[77]선택 사항으로 표시된 변수[77] 또는 상수는 기본 유형의 값을 갖거나 nil
. 선택적 유형은 기본 유형을 감싸므로 다른 인스턴스가 생성됩니다. String
그리고. String?
기본적으로 다른 유형이고, 전자는 유형입니다. String
후자의 경우는 Optional
그것은 아마도 어느 정도를 유지하고 있을 것입니다. String
가치.
내부 값에 액세스하려면 0이 아니라고 가정하고 인스턴스가 내부에 노출되도록 래핑을 해제해야 합니다. 이것은 다음과 같이 수행됩니다. !
연산자:
허락하다 마이밸류 = 선택적 인스턴스!.어떤 방법()
이 경우에는. !
연산자 포장 풀기 anOptionalInstance
사건을 내부에 노출시키기 위해 메소드 호출을 허용합니다. 만약에. anOptionalInstance
null-pointer 오류가 발생하여 프로그램을 종료합니다. 이것은 힘을 푸는 것으로 알려져 있습니다. 옵션은 옵션 체인을 사용하여 안전하게 해제할 수 있습니다. 옵션 체인은 먼저 인스턴스가 0인지 여부를 테스트한 다음 null이 아닌 경우 해제합니다.
허락하다 마이밸류 = 선택적 인스턴스?.어떤 방법()
이 경우 런타임이 호출합니다. someMethod
다만 anOptionalInstance
0은 아니고, 오류를 억제합니다. A ?
모든 옵션 속성 뒤에 배치해야 합니다. 이러한 속성 중 하나라도 영이 아니면 전체 식을 영으로 평가합니다. 연쇄화라는 용어의 기원은 여러 메소드 호출/수신이 함께 연쇄화되는 더 일반적인 경우에서 비롯됩니다. 예를 들어 다음과 같습니다.
허락하다 세입자 = 빌딩..테넌트 목록[5] 허락하다 그들의 임대. = 세입자.리스 상세 정보 허락하다 리스시작 = 그들의 임대.?.시작 날짜
다음으로 줄일 수 있습니다.
허락하다 리스시작 = 빌딩..테넌트 목록[5].리스 상세 정보?.시작 날짜
스위프트의 옵션을 사용하면 컴파일러가 정적인 디스패치를 사용할 수 있습니다. 왜냐하면 언랩핑 작업은 정의된 인스턴스(래퍼)에서 호출되지만 런타임 디스패치 시스템에서 발생하기 때문입니다.
값종류
많은 객체 지향 언어에서 객체는 내부적으로 두 부분으로 표현됩니다. 개체는 힙에 배치된 데이터 블록으로 저장되며 해당 개체의 이름(또는 "handle")은 포인터로 표시됩니다. 객체는 포인터의 값을 복사하여 메서드 간에 전달되므로, 힙의 동일한 기본 데이터를 복사본을 가진 사용자가 액세스할 수 있습니다. 반면에, 정수나 부동 소수점 값과 같은 기본적인 유형은 직접적으로 표현되며, 핸들에는 데이터가 포함되어 있고 데이터는 복사를 통해 메서드로 직접 전달됩니다. 이러한 액세스 스타일을 개체의 경우 참조 전달, 기본 유형의 경우 값 전달이라고 합니다.
두 개념 모두 장단점이 있습니다. 개체는 창 설명이나 문서 내용과 같이 데이터가 큰 경우에 유용합니다. 이러한 경우 데이터에 대한 액세스는 전체 데이터 구조를 복사하는 대신 32비트 또는 64비트 값을 복사하여 제공됩니다. 그러나 정수와 같은 작은 값은 포인터와 크기가 같으므로(일반적으로 둘 다 하나의 단어) 포인터를 통과하는 것보다 포인터를 통과하는 것이 유리하지 않습니다.
Swift는 참조 전달 또는 값 전달 시맨틱스를 사용하는 객체에 대한 내장 지원을 제공합니다. class
선언문과 사용하는 후자. struct
. 스위프트의 구조들은 방법, 프로토콜 구현, 확장 메커니즘 사용 등 클래스와 거의 동일한 기능을 가지고 있습니다. 이러한 이유로 애플은 모든 데이터를 개체 또는 값에 대한 인스턴스(instance)라고 일반적으로 말합니다. 그러나 구조는 상속을 지원하지 않습니다.[78]
프로그래머는 응용 프로그램의 각 데이터 구조에 더 적합한 의미론을 자유롭게 선택할 수 있습니다. 창과 같은 더 큰 구조는 포인터로 전달할 수 있도록 클래스로 정의됩니다. 2D 포인트와 같이 더 작은 구조물을 구조물로 정의할 수 있습니다. 구조물은 값 단위로 전달되며 방향이나 참조 계수 없이 내부 데이터에 직접 액세스할 수 있습니다. Swift가 다음을 포함한 거의 모든 일반적인 데이터 유형에 이러한 유형을 사용할 수 있도록 하는 Pass-by-value 개념에 내재된 성능 향상이 있습니다. Int
그리고. Double
, 그리고 일반적으로 물체로 표현되는 유형, 예를 들어 String
그리고. Array
.[78]값 유형을 사용하면[78] 사용자 애플리케이션에서도 성능이 크게 향상될 수 있습니다.[79]
Array
, Dictionary
,그리고. Set
모두 쓰기 시 복사를 활용하여 프로그램이 데이터 값을 변경하려는 경우에만 데이터가 복사됩니다. 이는 다양한 액세스자가 사실상 동일한 데이터 저장소에 대한 포인터를 가지고 있음을 의미합니다. 따라서 데이터는 물리적으로 메모리에 하나의 인스턴스로 저장되지만 애플리케이션 레벨에서는 이러한 값이 별도이며 필요한 경우에만 쓰기 시 복사본으로 물리적 분리가 실행됩니다.[80]
확장
확장은 하위 클래스를 만들거나 원본 소스 코드에 액세스할 필요 없이 기존 유형에 새로운 기능을 추가합니다. 확장은 새 메서드, 초기화기, 계산 속성, 첨자 및 프로토콜 적합성을 추가할 수 있습니다.[81] 기본에 맞춤법 검사기를 추가하는 것이 한 예가 될 수 있습니다. String
의 모든 인스턴스를 의미하는 type String
프로그램에서 철자 검사 기능을 얻을 수 있습니다. 이 시스템은 또한 조직 기술로 널리 사용되어 관련 코드를 라이브러리와 같은 확장으로 수집할 수 있습니다.
확장은 다음과 같이 선언됩니다. extension
키워드
짜임새 있는 직사각형 { 허락하다 폭이: 더블 허락하다 높이: 더블 } 연장의 직사각형 { 바아 지역: 더블 { 돌아가다 높이 * 폭이 } }
프로토콜 지향 프로그래밍
프로토콜은 특정 유형이 일련의 메서드 또는 속성을 구현할 것을 약속하며, 이는 시스템의 다른 인스턴스가 해당 프로토콜을 구현하는 모든 인스턴스에서 해당 메서드를 호출할 수 있음을 의미합니다. 이는 현대의 객체 지향 언어에서 여러 특징 집합이 완전히 유사한 것은 아니지만 여러 상속을 대체하기 위해 자주 사용됩니다.
목표-C 및 프로토콜 개념을 구현하는 대부분의 다른 언어에서는 각 클래스에서 필요한 방법이 구현되도록 하는 것은 프로그래머의 몫입니다.[82] Swift는 확장을 사용하여 이러한 메서드를 추가하고 일반 프로그래밍(일반 프로그래밍)을 사용하여 이를 구현할 수 있는 기능을 추가합니다. 이를 결합하면 프로토콜을 한 번 작성할 수 있으며 다양한 인스턴스를 지원합니다. 또한 확장 메커니즘을 사용하여 해당 프로토콜을 정의에 나열하지 않은 개체에 프로토콜 적합성을 추가할 수 있습니다.[83]
예를 들어 프로토콜은 다음과 같이 선언될 수 있습니다. Printable
, 프로토콜을 준수하는 인스턴스가 다음을 구현하도록 보장합니다. description
재산과 재산 printDetails()
메서드 요구 사항:
// Printable(인쇄 가능)이라는 프로토콜 정의 의전 인쇄 가능 { 바아 묘사: 끈 { 얻다 } // 읽기 전용 속성 요구 사항 재미있는 인쇄상세정보() // 방법요구사항 }
이제 이 프로토콜은 다른 유형에서 채택할 수 있습니다.
// 클래스에 인쇄 가능 프로토콜 채택 학급 마이 클래스: 인쇄 가능 { 바아 묘사: 끈 { 돌아가다 "My Class의 인스턴스" } 재미있는 인쇄상세정보() { 활자로 인쇄하다(묘사) } }
확장을 사용하여 유형에 프로토콜 적합성을 추가할 수 있습니다. 프로토콜 자체를 확장하여 요구 사항의 기본 구현을 제공할 수도 있습니다. 채택자는 자체적으로 구현을 정의하거나 기본 구현을 사용할 수 있습니다.
연장의 인쇄 가능 { // 모든 인쇄 가능 인스턴스는 이 구현을 수신하거나 자체적으로 정의할 수 있습니다. 재미있는 인쇄상세정보() { 활자로 인쇄하다(묘사) } } // 이제 Bool은 Printable(인쇄 가능)을 준수하며 위의 PrintDetails() 구현을 상속합니다. 연장의 불: 인쇄 가능 { 바아 묘사: 끈 { 돌아가다 "가치가 있는 불의 예: \(자신)" } }
스위프트에서는 인터페이스를 지원하는 많은 현대 언어와 마찬가지로 프로토콜을 유형으로 사용할 수 있습니다. 이는 변수와 방법을 특정 유형 대신 프로토콜로 정의할 수 있음을 의미합니다.
재미있는 인쇄 가능한 것 가져오기() -> 조금도 인쇄 가능 { 돌아가다 진실의 } 바아 일종의 인쇄 가능사례 = 인쇄 가능한 것 가져오기() 활자로 인쇄하다(일종의 인쇄 가능사례.묘사) // "가치가 있는 불의 인스턴스: true" 인쇄
구체적인 유형은 중요하지 않습니다. someSortOfPrintableInstance
즉, 컴파일러는 프로토콜을 준수하고 따라서 이 코드가 안전한지 확인합니다. 이 구문은 또한 컬렉션이 프로토콜을 기반으로 할 수 있다는 것을 의미합니다. let printableArray = [any Printable]
.
Swift의 표준 라이브러리에서는 확장과 프로토콜이 모두 광범위하게 사용됩니다. Swift 5.9에서는 표준 라이브러리 내의 모든 심볼 중 약 1.2%가 프로토콜이었고, 그 외 12.3%는 프로토콜 요구사항 또는 기본 구현이었습니다.[84] 예를 들어 Swift는 확장 기능을 사용하여 Equatable
Strings 및 Array와 같은 기본 유형의 프로토콜을 사용하여 다음과 비교할 수 있습니다. ==
교환입니다. 그 Equatable
프로토콜은 또한 다음과 같은 기본 구현을 정의합니다.
재미있는 !=<T : 등식>(lhs: T, rhs: T) -> 불
이 함수는 다음과 일치하는 모든 인스턴스에서 작동하는 메서드를 정의합니다. Equatable
, not을 제공하는 것은 연산자와 같습니다. 모든 인스턴스(클래스 또는 구조)는 다음을 준수하는 것만으로 이 구현을 자동으로 얻습니다. Equatable
.[85]
프로토콜, 확장, 제네릭을 결합하여 정교한 API를 만들 수 있습니다. 예를 들어, 제약 조건을 통해 유형은 채택 유형의 특성에 따라 프로토콜이나 방법을 조건부로 채택할 수 있습니다. 일반적인 사용 사례는 컬렉션에 포함된 요소가 있는 경우에만 컬렉션 유형에 대한 메서드를 추가하는 것일 수 있습니다. Equatable
:
연장의 배열 어디에 원소: 등식 { // allEqual은 Equatable 요소가 포함된 Array 인스턴스에서만 사용할 수 있습니다. 재미있는 올 이퀄() -> 불 { 위해서 원소의 안에 자신 { 한다면 원소의 != 자신.첫번째 { 돌아가다 거짓의 } } 돌아가다 진실의 } }
동시성
Swift 5.5는 언어에 구조화된 동시성을 도입했습니다.[86] Structured concurrency는 Kotlin, JavaScript, Rust와 유사한 Async/ait 구문을 사용합니다. 비동기 함수는 다음과 같이 정의됩니다. async
매개 변수 목록 뒤에 키워드를 지정합니다. 비동기 함수를 호출할 때 await
함수를 호출하는 동안 실행이 일시 중단될 가능성이 있음을 나타내려면 함수 앞에 키워드를 작성해야 합니다. 기능이 일시 중단되는 동안 프로그램은 동일한 프로그램에서 다른 동시 기능을 실행할 수 있습니다. 이 구문을 사용하면 프로그램이 잠재적인 일시 중단 지점을 명확하게 호출하고 이전에 널리 사용된 폐쇄 콜백으로 인해 발생한 피라미드 버전(프로그래밍)을 피할 수 있습니다.[87]
재미있는 텍스트 다운로드(이름.: 끈) 비동기의 -> 끈 { 허락하다 결과 = // 비동기식 다운로드 코드가 있습니다. 돌아가다 결과 } 허락하다 본문 = 기다리다 텍스트 다운로드("text 1")
그 async let
구문을 사용하면 여러 함수를 병렬로 실행할 수 있습니다. await
프로그램이 종료될 때까지 대기하기 위해 일시 중단되는 시점을 표시하는 데 다시 사용됩니다. async
이전에 호출된 함수들.
// 다운로드해야 할 각 전화텍스트가 병렬로 실행됩니다. 비동기의 허락하다 text1 = 텍스트 다운로드(이름.: "text 1") 비동기의 허락하다 text2 = 텍스트 다운로드(이름.: "text 2") 비동기의 허락하다 text3 = 텍스트 다운로드(이름.: "text 3") 허락하다 인쇄할 텍스트 = 기다리다 [text1, text2, text3] // 세 개 모두 다운로드할 때까지 일시 중단문자 전화가 돌아왔습니다. 활자로 인쇄하다(인쇄할 텍스트)
작업 및 작업 그룹을 명시적으로 생성하여 런타임 동안 동적 하위 작업 수를 생성할 수 있습니다.
허락하다 작업 처리 = 작업 { 기다리다 텍스트 다운로드(이름.: "어떤 텍스트") } 허락하다 결과 = 기다리다 작업 처리.가치
Swift는 Actor 모델을 사용하여 변이 가능한 상태를 분리하여 다양한 작업이 안전한 방법으로 공유 상태를 변이할 수 있도록 합니다. 배우들은 다음과 같이 선언됩니다. actor
키워드이고 클래스와 같은 참조 유형입니다. 한 작업만 동시에 행위자의 돌연변이 상태에 액세스할 수 있습니다. 행위자는 자신의 내부 상태에 자유롭게 액세스하고 변경할 수 있지만 개별 작업에서 실행되는 코드는 각 액세스를 다음과 같이 표시해야 합니다. await
다른 질문이 배우의 상태에 대한 액세스를 완료할 때까지 코드가 일시 중단될 수 있음을 나타내는 키워드입니다.
배우. 디렉토리 { 바아 이름들: [끈] = [] 재미있는 더하다(이름.: 끈) { 이름들.보따리를 달다(이름.) } } 허락하다 디렉토리 = 디렉토리() // 코드는 다른 작업이 액터 액세스를 완료할 때까지 일시 중지됩니다. 기다리다 디렉토리.더하다(이름.: "터커") 활자로 인쇄하다(기다리다 디렉토리.이름들)
라이브러리, 런타임 및 개발
애플 시스템에서 스위프트는 기존의 오브젝티브-C 시스템과 동일한 런타임을 사용하지만 iOS 7 또는 macOS 10.9 이상이 필요합니다. 또한 그랜드 센트럴 디스패치에 따라 다릅니다.[88] 스위프트와 오브젝티브-C 코드를 하나의 프로그램에서 사용할 수 있으며, 확장하면 C와 C++도 사용할 수 있습니다. 스위프트 5.9부터는 스위프트 코드에서 C++ 코드를 직접 사용할 수 있습니다.[89] Object-C의 경우 Swift는 객체 모델에 상당한 접근 권한을 가지고 있으며, Object-C 코드를 서브클래스, 확장 및 사용하여 프로토콜 지원을 제공할 수 있습니다.[90] 그 반대는 참이 아닙니다. 스위프트 클래스는 목표-C에서 하위 클래스로 분류될 수 없습니다.[91]
이러한 프로그램의 개발과 기존 코드의 재사용을 돕기 위해 Xcode 6 이상은 목적-C 코드를 Swift에 노출시키기 위해 브리징 헤더를 구축하고 유지하는 반자동 시스템을 제공합니다. 이것은 프로젝트의 Swift 코드에 필요한 모든 Objective-C 심볼을 정의하거나 가져오기만 하는 추가 헤더 파일의 형태를 취합니다. 그 시점에서 스위프트는 그 수입품에 선언된 종류, 기능, 변수들을 스위프트로 작성된 것처럼 언급할 수 있습니다. Objective-C 코드는 프로젝트의 Swift 심볼의 Objective-C 선언과 함께 자동으로 유지관리되는 헤더 파일을 가져와 Swift 코드를 직접 사용할 수도 있습니다. 예를 들어, "MyApp"이라는 혼합 프로젝트의 Objective-C 파일은 코드로 Swift 클래스나 함수에 액세스할 수 있습니다. #import "MyApp-Swift.h"
. 그러나 이 메커니즘을 통해 모든 기호를 사용할 수 있는 것은 아닙니다. 일반 유형, 비객체 옵션 유형, 정교한 에넘 또는 유니코드 식별자와 같은 스위프트 고유 기능을 사용하면 목표-C에서 기호에 액세스할 수 없게 될 수 있습니다.[92]
Swift는 또한 개발 환경에서 읽을 수 있는 메타데이터인 속성을 제한적으로 지원하며 컴파일된 코드의 일부가 아닙니다. 목표-C와 마찬가지로 속성은 다음을 사용합니다. @
구문이지만 현재 사용 가능한 집합은 작습니다. 한 가지 예는 @IBOutlet
코드에서 지정된 값을 출구로 표시하는 특성으로, IB(Interface Builder) 내에서 사용할 수 있습니다. 콘센트는 화면에 있는 디스플레이의 값을 코드로 개체에 묶는 장치입니다.
애플 시스템이 아닌 경우, 스위프트는 오브젝티브-C 런타임이나 다른 애플 시스템 라이브러리에 의존하지 않습니다. 여기에는 Foundation Kit을 위한 "swift-corelibs-foundation", Grand Central Dispatch를 위한 "swift-corelibs-lib-dispatch", Xcode의 XCTest API를 위한 "swift-corelibs-xctest"가 포함됩니다.[93]
2019년 현재, 애플은 Xcode 11과 함께 Swift라는 주요 새로운 UI 패러다임을 추가했습니다.UI. 스위프트UI는 오래된 Interface Builder 패러다임을 새로운 선언적 개발 패러다임으로 대체합니다.[94]
기억관리
Swift는 자동 참조 카운트(ARC)를 사용하여 메모리를 관리합니다. 클래스 또는 클로저의 모든 인스턴스는 프로그램이 보유하고 있는 참조 횟수의 실행 집계를 유지하는 참조 카운트를 유지합니다. 이 카운트가 0에 도달하면 인스턴스가 할당 해제됩니다. 이 자동 할당 해제는 인스턴스가 더 이상 필요하지 않은 즉시 할당 해제되기 때문에 쓰레기 수집기가 필요하지 않습니다.
두 인스턴스가 서로를 강하게 참조하는 경우(예: A 참조 B, B 참조 A 참조) 강력한 참조 주기가 발생할 수 있습니다. 두 인스턴스 모두 참조 카운트가 0에 도달할 수 없기 때문에 할당이 해제되지 않아 메모리 누수가 발생합니다. 스위프트가 키워드를 제공합니다. weak
그리고. unowned
강력한 기준 주기를 방지합니다. 이러한 키워드를 사용하면 인스턴스의 참조 횟수를 늘리지 않고 참조할 수 있습니다. weak
참조는 변경될 수 있으므로 선택 변수여야 합니다. nil
.[95]액세스 시도[95] 중 unowned
이미 할당 해제된 값으로 인해 런타임 오류가 발생합니다.
클래스 내 폐쇄는 또한 자체 참조를 캡처하여 강력한 참조 주기를 만들 수 있습니다. 취약하거나 소유되지 않은 것으로 취급되는 자체 참조는 캡처 목록을 사용하여 표시할 수 있습니다.
학급 사람인 { 허락하다 이름.: 끈 약한 바아 집입니다: 집입니다? // 기준 주기를 깨기 위해 약한 기준으로 정의됩니다. 약한 참조는 참조하는 인스턴스의 참조 카운트를 증가시키지 않습니다. 그 안에(이름.: 끈) { 자신.이름. = 이름. } 디인티의 { 활자로 인쇄하다("초기화 해제됨 \(이름.)") } } 학급 집입니다 { 허락하다 주소.: 끈 바아 주인: 사람인? 그 안에(주소.: 끈, 주인: 사람인?) { 자신.주소. = 주소. 자신.주인 = 주인 } 디인티의 { 활자로 인쇄하다("초기화 해제됨 \(주소.)") } } 바아 안정된: 사람인? = 사람인(이름.: 스테이시) 바아 하우스21b: 집입니다? = 집입니다(주소.: 베이커 가 21b, 주인: 안정된) 안정된?.집입니다 = 하우스21b // stacy와 house42b는 이제 서로를 지칭합니다. 안정된 = 영의 // house21b가 여전히 stacy에 대한 참조를 유지하고 있기 때문에 stacy에 대한 참조 카운트는 이제 1입니다. 하우스21b = 영의 // house21b의 참조 카운트는 0으로 떨어지며, house21b가 stacy에 대한 강력한 참조를 가지고 있는 마지막 인스턴스였기 때문에 stacy의 카운트는 0으로 떨어집니다. // 인쇄: // 베이커 스트리트 21b 초기화 해제 // 초기화 해제 스테이시
디버깅
스위프트 시스템의 핵심 요소는 읽기-평가-인쇄 루프(REPL)를 사용하여 개발 환경 내에서 깨끗하게 디버그되고 실행될 수 있다는 점이며, 이는 전통적인 시스템 프로그래밍 언어보다 파이썬의 스크립트 기능과 더 공통적인 상호 작용 특성을 제공합니다. REPL은 코드 또는 디버거 변경에 즉시 응답하는 플레이그라운드, Xcode 환경 또는 플레이그라운드 앱 내에서 실행되는 대화형 뷰를 통해 더욱 향상되었습니다.[96] 놀이터에서는 프로그래머가 마크다운 문서와 함께 스위프트 코드를 추가할 수 있습니다. 프로그래머는 콘솔이나 Xcode와 같은 IDE에서 LLDB를 사용하여 코드를 단계적으로 수행하고 중단점을 추가할 수 있습니다.
다른 언어와의 비교
스위프트는 C 계열 프로그래밍 언어로 간주되며 다양한 면에서 C와 유사합니다.
- C의 대부분의 사업자들도 Swift에 등장하지만, 다음과 같은 사업자들도 있습니다.
+
행동이 조금 다릅니다 예를들면,+
오버플로우에 대한 스위프트 트랩에 있는 반면.&+
오버플로우에 랩핑하는 C-like 동작을 나타내는 데 사용됩니다. - 곱슬괄호는 문을 그룹화하는 데 사용됩니다.
- 변수는 등호를 사용하여 할당되지만 연속된 두 등호를 사용하여 비교됩니다. 두 개의 데이터 요소가 동일한 개체를 참조하는지 확인하기 위해 새 ID 연산자인 ===가 제공됩니다.
- 제어문
while
,if
,그리고.switch
유사하지만 확장된 기능이 있습니다. 예를 들어, a.switch
integer이 아닌 경우를 생각하면while
그리고.if
지원 패턴 매칭 및 조건부 랩핑 해제 옵션,for
을 사용합니다.for i in 1...10
통사의 - 대괄호는 배열과 함께 사용되며, 배열을 선언하고 둘 중 하나에서 지정된 인덱스의 값을 가져옵니다.
목표-C와 유사한 점도 있습니다.
- 기본 숫자 유형(
Int, UInt, Float, Double
) - 클래스 메서드는 인스턴스 메서드와 같이 상속됩니다.
self
클래스 메소드는 메소드가 호출된 클래스입니다. - 유사한.
for
...in
열거 구문
목표-C와의 차이점은 다음과 같습니다.
- 문은 세미콜론(semicolon)으로 끝날 필요가 없습니다.
;
한 줄에 두 개 이상의 문을 허용하려면 이러한 문을 사용해야 합니다. - 헤더 파일이 없습니다.
- 유형 추론을 사용합니다.
- 일반적인 프로그래밍.
- 함수는 1등급 개체입니다.
- 열거형 사례에는 연관된 데이터(대수 데이터 유형)가 있을 수 있습니다.
- 연산자를 클래스에 대해 재정의할 수 있으며(연산자 과부하), 새로운 연산자를 정의할 수 있습니다.
- 문자열은 유니코드를 완벽하게 지원합니다. 대부분의 유니코드 문자는 식별자 또는 연산자에서 사용할 수 있습니다.
- 예외 취급은 없습니다. Swift 2는 서로 다른 호환되지 않는 오류 처리 모델을 소개합니다.[97]
- 이전 C족 언어에서 오용하기 쉬운 몇 가지 기능이 제거되었습니다.
- 포인터는 기본적으로 노출되지 않습니다. 프로그래머가 참조하거나 참조 취소를 위해 이름을 추적하고 표시할 필요가 없습니다.
- 할당은 값을 반환하지 않습니다. 이렇게 하면 일반적인 쓰기 오류를 방지할 수 있습니다.
i = 0
대신에i == 0
컴파일 시간에 오류를 발생시킵니다. - 사용할 필요 없음
break
의 진술.switch
토막글 개별 사례는 다음 사례로 넘어가지 않습니다.fallthrough
문을 사용합니다. - 변수와 상수는 항상 초기화되고 배열 경계는 항상 확인됩니다.
- C의 부호화된 정수에 대해 정의되지 않은 동작을 초래하는 정수 오버플로는 Swift에서 런타임 오류로 트랩됩니다. 프로그래머는 특수 산술 연산자를 사용하여 오버플로를 허용하도록 선택할 수 있습니다.
&+
,&-
,&*
,&/
그리고.&%
. 속성min
그리고.max
는 모든 정수 유형에 대해 Swift에 정의되어 있으며 외부 라이브러리의 각 유형에 대해 정의된 상수에 의존하는 대신 잠재적인 오버플로를 안전하게 확인하는 데 사용할 수 있습니다. - 의 한 가지 진술 형식.
if
그리고.while
, 문 주변에 교정기를 생략할 수 있는 이 기능은 지원되지 않습니다. - C식 열거
for (int i = 0; i < c; i++)
, 개별적으로 오류가 발생하기 쉬운 것은 지원되지 않습니다(Swift 3 이후부터).[98] - 사전 및 사후 증가 및 감소 연산자()
i++
,--i
...)는 지원되지 않습니다.(Swift 3 이후부터) C-스타일 이후로 더욱 그렇습니다.for
Swift 3 이후로는 문도 지원되지 않습니다.[99]
개발 및 기타 구현
스위프트는 리눅스에서 실행될 수 있기 때문에 서버 측 언어로도 사용되기도 합니다.[100] IBM의 Kitura(현재는 단종), Perfect(퍼펙트), Vapor(증기)와 같은 일부 웹 프레임워크가 이미 개발되었습니다.
공식 "Server APIs" 작업 그룹도 애플에 의해 시작되었으며,[101] Swift 개발자 커뮤니티의 구성원들이 중심적인 역할을 하고 있습니다.[102]
마이크로소프트의 공용 언어 인프라스트럭처인 코코아(.)를 대상으로 하는 스위프트의 두 번째 무료 구현.NET), Java 및 Android 플랫폼은 RemObjects Software의 Elements 컴파일러의 일부로 존재합니다.[103]
LLVM과 Macintosh Programmer's Workshop의 툴체인을 결합하여 Mac OS 9에서 매우 작은 부분의 언어를 실행할 수 있습니다.[104]
참고 항목
참고문헌
- ^ 미국 특허 제9329844호
- ^ "Swift Has Reached 1.0". Apple. September 9, 2014. Retrieved March 8, 2015.
- ^ "Release 5.9.1". October 19, 2023. Retrieved October 20, 2023.
- ^ "Swift, Objectively".
Swift is proprietary and closed: It is entirely controlled by Apple and there is no open source implementation.
- ^ Lattner, Chris (June 11, 2014). "Re: [LLVMdev] [cfe-dev] [Advertisement] open positions in Apple's Swift compiler team". Archived from the original on July 14, 2014. Retrieved June 12, 2014.
You can imagine that many of us want it to be open source and part of LLVM, but the discussion hasn't happened yet, and won't for some time.
- ^ Lattner, Chris (June 3, 2014). "Chris Lattner's Homepage". Chris Lattner. Retrieved June 3, 2014.
The Swift language is the product of tireless effort from a team of language experts, documentation gurus, compiler optimization ninjas, and an incredibly important internal dogfooding group who provided feedback to help refine and battle-test ideas. Of course, it also greatly benefited from the experiences hard-won by many other languages in the field, drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.
- ^ a b Lattner, Chris (June 3, 2014). "Chris Lattner's Homepage". Chris Lattner. Retrieved June 3, 2014.
I started work on the Swift Programming Language in July of 2010. I implemented much of the basic language structure, with only a few people knowing of its existence. A few other (amazing) people started contributing in earnest late in 2011, and it became a major focus for the Apple Developer Tools group in July 2013 [...] drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.
- ^ "Building assert() in Swift, Part 2: __FILE__ and __LINE__". Retrieved September 25, 2014.
- ^ "Influences - The Rust Reference". doc.rust-lang.org. Retrieved May 2, 2020.
- ^ "influenced by - V documentation". github.com. Retrieved November 3, 2023.
- ^ Lardinois, Frederic (June 2, 2014). "Apple Launches Swift, A New Programming Language For Writing iOS And OS X Apps". TechCrunch. Retrieved September 7, 2022.
- ^ Protocol-oriented Programming in Swift. Apple Inc. YouTube.
- ^ "Concepts are similar to Rust Traits".
- ^ Williams, Owen (June 2, 2014). "Tim Berners-Lee's sixtieth birthday Apple announces Swift, a new programming language for iOS". The Next Web. Retrieved June 2, 2014.
- ^ "Apple's new programming language Swift is now open source". The Verge. December 3, 2015. Retrieved December 5, 2015.
- ^ "Apple Open Sources Swift in Latest Pitch to the Enterprise". CIO Journal. The Wall Street Journal Blogs. December 3, 2015. Retrieved December 5, 2015.
- ^ "Looking back on Swift 3 and ahead to Swift 4". Swift Forums. July 29, 2016. Retrieved November 19, 2018.
- ^ "Swift-Evolution". Swift Evolution. Retrieved November 19, 2018.
- ^ "The RedMonk Programming Language Rankings: January 2018 – tecosystems". redmonk.com. March 7, 2018. Retrieved November 20, 2018.
- ^ Kremenek, Ted (March 25, 2019). "Swift 5 Released!".
- ^ Kremenek, Ted (September 20, 2019). "Swift 5.1 Released!". Archived from the original on February 26, 2022. Retrieved October 28, 2019.
- ^ Hudson, Paul (June 6, 2021). "What's new in Swift 5.5?". HackingWithSwift.com. Hacking with Swift. Retrieved June 8, 2021.
- ^ "Swift 5.9 Released". Swift.org. September 18, 2023. Retrieved October 9, 2023.
- ^ a b Platforms State of the Union, Session 102, Apple Worldwide Developers Conference, 2014년 6월 2일
- ^ The Swift Programming Language. Apple. June 2, 2014. Retrieved June 2, 2014.
- "Documentation". Swift.
- ^ "Swift Has Reached 1.0". September 9, 2014. Retrieved September 10, 2014.
- ^ "Xcode 6.1 Release Notes". October 22, 2014. Retrieved January 23, 2015.
- ^ "Xcode 6.3 Release Notes". April 8, 2015. Retrieved April 8, 2015.
- ^ "Swift 2 Apps in the App Store". Swift Blog. Retrieved March 13, 2016.
- ^ "Swift 3.0 Released!". Swift.org. September 13, 2016. Archived from the original on October 14, 2016. Retrieved October 26, 2016.
- ^ "Swift 4.0 Released!". Swift.org. September 17, 2017. Archived from the original on March 28, 2019. Retrieved March 1, 2018.
- ^ "Swift 4.1 Released!". Swift.org. March 29, 2018. Archived from the original on April 25, 2019. Retrieved March 30, 2018.
- ^ "Stack Overflow Developer Survey Results 2015".
- ^ "Stack Overflow Developer Survey Results 2016".
- ^ "Swift.org and Open Source". Swift.org. Apple Inc. Retrieved February 25, 2019.
- ^ "Introducing the IBM Swift Sandbox — Swift". Swift. Retrieved December 5, 2015.
- ^ Mayo, Benjamin (December 4, 2015). "Write Swift code in a web browser with the IBM Swift Sandbox". 9to5Mac. Retrieved December 5, 2015.
- ^ "After Apple open sources it, IBM puts Swift programming in the cloud ZDNet". ZDNet. Retrieved December 5, 2015.
- ^ "Swift Package Catalog and Swift Sandbox Deprecation". Retrieved November 9, 2018.
- ^ "Swift Playgrounds". Apple Developer. Retrieved June 19, 2016.
- ^ "Swift Playgrounds — Preview". Apple. Retrieved June 19, 2016.
- ^ Mayo, Benjamin (June 13, 2016). "Apple announces Swift Playgrounds for iPad at WWDC, public release in fall". 9to5Mac. Retrieved June 19, 2016.
- ^ Cunningham, Andrew (January 10, 2017). "Longtime Apple programmer and Swift creator leaves Apple for Tesla". Ars Technica.
- ^ Wuerthele, Mike (January 13, 2017). "New Swift project head Ted Kremenek said to be running the show behind the scenes for some time". AppleInsider.
- ^ Daniel Eran Dilger. "WWDC19: SwiftUI was the brightest star in a galaxy of new ideas". AppleInsider. Retrieved July 19, 2019.
- ^ "Swift.org - Download Swift". Retrieved June 21, 2020.
- ^ "Android SDKs for Swift". GitHub. Retrieved September 10, 2021.
- ^ "swift-lang package versions". Retrieved September 10, 2021.
- ^ Readdle (January 15, 2020). "Swift for Android: Our Experience and Tools". Medium. Retrieved August 20, 2020.
- ^ Anderson, Tim (March 30, 2020). "Official tailored Swift for Windows support promised in 5.3: Swift on more platforms – provided you do not need a GUI". The Register. Retrieved September 18, 2020.
- ^ "The Swift Linux Port". Swift.org. Apple Inc. December 3, 2015. Retrieved August 3, 2016.
- ^ Timmer, John (June 5, 2014). "A fast look at Swift, Apple's new programming language". Ars Technica. Condé Nast. Retrieved June 6, 2014.
- ^ Kremenek, Ted (March 25, 2019). "Swift 5 Released!". Swift.org. Retrieved March 28, 2019.
- ^ "Download Swift". Swift.org. Apple. Retrieved December 15, 2020.
- ^ Kremenek, Ted (April 26, 2021). "Swift 5.4 Released!". Swift.org. Apple. Archived from the original on April 26, 2021. Retrieved April 26, 2021.
- ^ Kremenek, Ted (March 14, 2022). "Swift 5.6 Released!". Swift.org. Apple. Retrieved March 14, 2022.
- ^ "Release Swift 5.6.1 Release · apple/Swift". GitHub.
- ^ "Release Swift 5.6.2 Release · apple/Swift". GitHub.
- ^ "Release Swift 5.6.3 Release · apple/Swift". GitHub.
- ^ Borla, Holly (September 12, 2022). "Swift 5.7 Released!". Swift.org. Apple. Retrieved September 23, 2022.
- ^ "Release Swift 5.7.1 Release · apple/Swift". GitHub.
- ^ "Release Swift 5.8 Release · apple/Swift". GitHub.
- ^ "Release Swift 5.8.1 Release · apple/swift". GitHub. Retrieved June 14, 2023.
- ^ "Release Swift 5.9 Release · apple/swift". GitHub. Retrieved September 18, 2023.
- ^ "Documentation". docs.swift.org. Retrieved November 17, 2023.
- ^ . Apple Inc https://developer.apple.com/wwdc22/110351. Retrieved November 17, 2023.
{{cite web}}
: 누락 또는 비움title=
(도와주세요) - ^ "Documentation". docs.swift.org. Retrieved October 15, 2023.
- ^ "Documentation". docs.swift.org. Retrieved October 15, 2023.
- ^ "Documentation". docs.swift.org. Retrieved October 15, 2023.
- ^ "Closures — The Swift Programming Language (Swift 5.5)". docs.swift.org. Retrieved August 31, 2021.
- ^ Macomber, Kyle; Yaskevich, Yavel; Gregor, Doug; McCall, John. "Multiple Trailing Closures". GitHub. Retrieved October 19, 2020.
- ^ "Documentation". docs.swift.org. Retrieved October 16, 2023.
- ^ "Strings and Characters". docs.swift.org. Retrieved October 16, 2023.
- ^ "Declarations — The Swift Programming Language (Swift 5.6)". docs.swift.org. Retrieved February 28, 2022.
- ^ "Access Control". developer.apple.com. Apple Inc. Retrieved October 25, 2016.
- ^ "Nullable Types", C# 프로그래밍 가이드, 마이크로소프트.
- ^ "Types". developer.apple.com. Apple Inc. Retrieved July 16, 2014.
- ^ a b "Classes and Structures". Apple.com.
- ^ Guhit, Fiel (February 14, 2015). "Performance Case Study on Swift 1.1, Swift 1.2, and Objective-C".
- ^ Building Better Apps with Value Types. Apple.
- ^ "Documentation". docs.swift.org. Retrieved November 28, 2023.
- ^ "Working with Protocols". Apple.
- ^ "NSCopying Protocol Reference". Apple.
- ^ "Swift standard library statistics". swiftinit.org. Swiftinit. Retrieved October 2, 2023.
- ^ Thompson, Mattt (September 2, 2014). "Swift Default Protocol Implementations". NSHipster.
- ^ "swift-evolution/proposals/0304-structured-concurrency.md at main · apple/swift-evolution". GitHub. Retrieved October 16, 2023.
- ^ "swift-evolution/proposals/0296-async-await.md at main · apple/swift-evolution". GitHub. Retrieved October 16, 2023.
- ^ "Swift 기반 앱은 macOS 10.9/iOS 7 이하에서 작동합니까?", StackOverflow
- ^ Inc, Apple (September 18, 2023). "Swift 5.9 Released". Swift.org. Retrieved October 9, 2023.
{{cite web}}
:last=
일반 이름(도움말)이 있습니다. - ^ "목적-C 행동으로 스위프트 클래스 작성", Apple Inc.
- ^ "Migrating Your Objective-C Code to Swift".
- ^ "동일 프로젝트의 신속하고 목표-C", Apple Inc.
- ^ "Apple: search "corelib"". GitHub.
- ^ "Xcode - SwiftUI- Apple Developer". developer.apple.com. Retrieved February 1, 2021.
- ^ Lanier, Brian; Groff, Joe. "Intermediate Swift". Apple. Retrieved July 3, 2014.
- ^ Metz, Cade. "Why Coders Are Going Nuts Over Apple's New Programming Language". Wired. Retrieved July 16, 2014.
- ^ "Error-Handling in Swift-Language". stackoverflow.com.
- ^ "apple/swift-evolution". GitHub. Retrieved April 4, 2016.
- ^ "apple/swift-evolution". GitHub. Retrieved April 4, 2016.
- ^ Barbosa, Greg (February 22, 2016). "IBM brings Swift to the cloud, releases web framework Kitura written in Apple's programming language". 9to5Mac. Retrieved May 16, 2016.
- ^ "Server APIs Work Group". Swift.org. October 25, 2016. Retrieved October 28, 2016.
- ^ "Swift.org". Swift.org. Archived from the original on May 10, 2021. Retrieved October 28, 2016.
- ^ "RemObjects Elements Compiler". Retrieved January 17, 2016.
- ^ Rose, Jordan (April 1, 2020). "Swift on Mac OS 9". -dealloc.