야곰의 스위프트 프로그래밍 - 부록

부록

스위프트의 주요 프로토콜

프로토콜 이름 설명
AnyObject 모든 클래스 타입이 암시적으로 준수
CustomStringConvertible description 프로퍼티를 재정의하여 사용자 정의 텍스트 표현을 할 수 있게 함
Equatable == / != 연산자를 사용하여 값이 동일한지 판단할 수 있는 타입
== 연산자를 구현해주어야 하고, 구현하면 != 연산자는 표준 라이브러리가 자동으로 구현해줌
Error 던질 수 있는 오류 값을 나타내는 타입
IteratorProtocol 시퀀스를 통한 반복을 위해 반복 상태와 인터페이스를 캡슐화
Hashable 정수 해시 값 제공. 딕셔너리의 키가 될 수 있는 타입
Collection 인덱스 및 서브스크립트로 요소에 접근할 수 있는 시퀀스
IntegerArithmetic 정수 연산을 지원하기 위한 요구사항
BinaryInteger 정수 타입을 위한 요구
Sequence (SequenceType) 시퀀스. for-in 구문으로 반복될 수 있는 타입
SignedInteger 부호 있는 정수 타입을 위한 요구사항
SignedNumeric 뺄셈 연산 가능 / 음수 표현 가능 / 0으로 초기화될 수 있는 타입
TextOutputStreamable 텍스트 스트리밍 기능을 실행할 수 있는 타입
String, Character, UnicodeScalar 등이 이 프로토콜을 준수함
UnsignedInteger 부호 없는 정수 타입
ExpressibleBy???Literal ??? 리터럴로 자신의 인스턴스를 초기화할 수 있는 타입
Set 타입은 ExpressibleByArrayLiteral 프로토콜을 준수하므로 배열의 형태로 Set 타입 인스턴스를 만들 수 있음
??? : Array / Boolean / Dictionary / Float / Integer / Nil / String / UnicodeScalar

스위프트의 주요 함수

abs

  • 전달인자로 전달받은 값의 절대 값을 반환
  • 전달인자로 SignedNumeric 프로토콜을 준수하는 타입을 받으므로 부호 있는 정수 타입이 들어올 수 있다.

assert

  • C 스타일의 assert
    • Xcode의 디버그용 빌드 기본 구성인 경우 condition 실행 결과가 false이면 message를 출력한 후 프로그램을 중단하고 디버그 가능한 상태로 전환
    • Xcode의 배포용 빌드 기본 구성인 경우 프로그램에 어떠한 영향도 미치지 않음

assertFailure

  • 디버그용 빌드에서 프로그램을 중단하고 디버그 가능한 상태로 전환하고 싶을 때 사용
    • Xcode의 디버그용 빌드 기본 구성인 경우 message를 출력한 후 프로그램을 중단하고 디버그 가능한 상태로 전환
    • Xcode의 배포용 빌드 기본 구성인 경우 프로그램에 어떠한 영향도 미치지 않음

debugPrint

  • output 전달인자에 출력 타겟을 명시하여 디버깅에 적합하도록 함

dump

  • 표준 출력 또는 지정된 출력 스트림을 통해 객체 내용의 덤프를 생성

fatalError

  • message 전달인자에 명시된 내용을 출력하고 무조건 프로그램 실행을 중단시킴

getVaList

  • 매개변수를 통해 전달받은 [CVarArg] 타입을 C언어의 매개변수 리스트 포인터 타입인 CVaListPointer로 변환
  • CVaListPointer 타입은 C언어의 va_list 전달인자로 사용할 수 있음
  • C언어 함수를 Swift 함수로 매핑할 때 활용할 수 있음

max

  • 전달인자 중 가장 큰 값을 반환. 동일한 값이 있다면 제일 마지막의 값을 반환

min

  • 전달인자 중 가장 작은 값을 반환. 동일한 값이 있다면 제일 처음의 값을 반환

numericCast

  • 정수 타입의 값을 다른 크기의 정수 타입으로 변환. 오버플로우 발생시 런타임 에러 발생함

precondition

  • Xcode의 디버그용 빌드 기본 구성인 경우 condition 실행 결과가 false이면 message를 출력한 후 프로그램을 중단하고 디버그 가능한 상태로 전환
  • Xcode의 배포용 빌드 기본 구성인 경우 condition 실행 결과가 false이면 프로그램 실행을 중단함

preconditionFailure

  • Xcode의 디버그용 빌드 기본 구성인 경우 message를 출력한 후 프로그램을 중단하고 디버그 가능한 상태로 전환
  • Xcode의 배포용 빌드 기본 구성인 경우 프로그램 실행을 중단함

print

  • 표준 출력 또는 outputitems의 텍스트 표현을 작성

readLine

  • 표준 입력을 통해 한 줄씩 혹은 EOF(End Of File)을 발견할 때까지 읽어 들여 문자열을 반환함
  • UTF-8로 해석됨
  • strippintNewLine 매개변수에 true를 전달하면 한 줄씩 읽어들임. 기본값 true

repeatElement

  • count 수만큼 element 타입의 Repeated 컬렉션을 생성하여 반환

swap

  • ab의 값을 서로 교환함

transcode

  • 유니코드로 인코딩한 입력값을 다른 유니코드로 인코딩된 값으로 변경
  • ex) UTF-8 -> UTF-32

type

  • 전달받은 값의 메타 타입 인스턴스 반환. 전달받은 값의 타입을 알아낼 때 활용 가능

unsafeBitCast

  • 전달받은 값의 비트를 다른 타입의 형식으로 해석하여 반환
  • type은 원래 x와 같은 비트 자릿수를 가진 타입이어야 함
    • IntDouble로 해석 가능, IntFloat로 해석 불가능

unsafeDownCast

  • x as T와 동일한 결과 반환. x is T가 true인 것을 확신할 때만 사용할 것

withoutActuallyEscaping

  • 비탈출 클로저로 전달된 클로저를 탈출 클로저인 척 실행할 수 있게 해줌

withVaList

  • args 매개변수로 전달받은 [CVarArg] 타입의 값들을 CVaListPointer 타입으로 변환한 후 함수의 body 매개변수로 전달받는 클로저의 매개변수로 다시 전달함. 클로저에서 결과값을 만들어 함수의 최종 반환값으로 함

zip

  • 두 시퀀스를 하나의 시퀀스로 짝을 이루도록 만들어줌

스위프트의 예약어

예약어

  • 프로그래밍 언어에서 미리 사용하기로 약속되어 있는 단어
  • 식별자로 사용할 수 없음
  • 일부 예약어는 `를 사용하여 이름으로 사용할 수 있음
    • let, self, var 등

키워드

  • 프로그래밍 언어에서 특정 기능을 실행하기 위해 미리 지정해둔 단어. 명령어나 어떤 의미가 부여된 단어
    • var, let, func 등
  • 다른 용도로 사용하거나 다른 식별자로 사용할 수 없음
종류 목록
선언 associatetype / class / deinit / enum / extension / fileprivate / func / import / init / inout / internal / let / open /operator / private / protocol / public / static / struct / subscript / typealias / var
구문 break / case / continue / default / defer / do / else / through / fallthrough / for / guard / if / in / repeat / return / switch / where / while
패턴 _
타입 및 기타 표현 as / catch / false / is / nil / rethrows / super / self / Self / throw / throws / true / try / #column / #file / #function / #line / #sourceLocation
#으로 시작 #available / #column / #else / #elseif / #endif / #file / #function / #if / #selector / #sourceLocation
특정 문맥에 의해 예약됨 associativity / convenience / dynamic / didSet / final / get / infix / indirect / lazy / left / mutating / none / nonmutating / optional / override / postfix / precedence / prefix / Protocol / required / right / set / type / unowned / weak / willSet
사용자 정의 연산자로 사용 불가능한 특수기호 ( / ) / { / } / [ / ] / . / , / : / ; / = / @ / # / &(전위 연산자) / -> / ` / ? / !(후위 연산자)
선언 수식어 dynamic / final / lazy / optional / required / weak / open / public / internal / fileprivate / private

디버깅 식별자

빌드 후 실행 중 디버깅을 할 때 유용하게 사용할 수 있는 식별자

  • #file : 현재 코드가 실행 중인 파일 이름. String
  • #line : 현재 코드가 실행되고 있는 파일의 몇 번 줄에 위치하는지 나타냄. Int
  • #column : 현재 코드가 실행되고 있는 줄의 몇 번 칸에 위치하는지 나타냄. Int
  • #function : 현재 코드가 실행되고 있는 함수의 이름. String

컴파일러 제어 구문

컴파일러 제어 구문을 사용하여 컴파일에 영향을 줄 수 있음

조건부 컴파일 블록

컴파일 조건에 맞는 코드는 컴파일 단계에서 포함시키고, 그렇지 않은 코드는 컴파일하지 않음

#if 컴파일_조건_1
// 컴파일_조건_1이 참이면 컴파일될 코드
#elseif 컴파일_조건_2
// 컴파일_조건_2가 참이면 컴파일될 코드
#else
// 컴파일_조건_1과 컴파일_조건_2가 모두 거짓인 경우 컴파일될 코드
#endif

컴파일 조건으로 Bool 타입의 값 / 빌드 플래그 값 (DEBUG / TEST_RELEASE / RELEASE 등) / 플랫폼이나 언어 버전을 체크하는 함수 등이 들어갈 수 있음

플랫폼 및 언어 버전 체크 함수 유효한 전달인자 값
os() macOS / iOS / watchOS / tvOS / Linux
arch() I386 / x86_64 / arm / arm64
swift() >=버전숫자

조건부 컴파일 블록에 포함된 코드는 컴파일이 되든 안되든 문법 검사를 하나, Swift 버전을 검사하는 조건부 컴파일 블록 내부의 코드는 문법 검사를 하지 않음. 언어의 버전이 변경됨에 따라 변경된 문법이 컴파일 오류를 발생시키지 않게 하기 위함

라인 제어 구문

  • 라인 번호와 파일 이름을 소스 코드가 컴파일될 때 다른 라인 번호와 파일 이름을 사용하도록 의도적으로 변경할 때 사용
  • #file / #line의 값을 마음대로 변경해주거나 초기화할 수 있음
  • #sourceLocation을 사용
// #file과 #line의 리터럴 표현값 변경. 파일명은 문자열, 라인번호는 0 이상의 정수
#sourceLocation(file: 파일명, line: 라인번호)
// 위의 코드가 변경한 #file과 #line을 원래 파일에서의 위치대로 복원
#sourceLocation()

사용 가능 조건 확인

프로그램 실행 중 동적으로 API 사용이 가능한지 판단할 수 있음. if, guard, while 등과 함께 사용 가능

&&, || 등의 논리연산을 사용하여 조건을 추가하거나 병합할 수 없음

if #available(플랫폼_이름_버전, ..., *) {
// API가 사용 가능하면 실행할 코드
} else {
// API가 사용 불가능하면 실행할 코드
}

#available(iOS 11.3.1, *) / #available(macOS 10.13, *) / #available(iOS 12.0, macOS 10.14, *)와 같이 작성 가능

속성

선언 또는 타입에 대한 부가 정보를 나타냄

@ 표시를 속성 이름 앞에 명시함. @ 표시 뒤에는 속성 이름과 필요한 전달인자를 명시함

선언 속성

클래스 선언, 함수 선언, 열거형 선언, 프로토콜 선언 등 선언에만 적용 가능

available

  • 특정 플랫폼 또는 운영체제의 버전에 관련된 속성. 현재 빌드 환경이 속성과 맞지 않는다면 해당 코드 블록은 컴파일되지 않음
  • 저장 프로퍼티에는 사용 가능 조건을 줄 수 없음
  • 매개변수가 두 개 이상 나열되는 리스트
  • 매개변수로 사용할 수 있는 플랫폼 이름
    • iOS / macOS / watchOS / tvOS / swift
    • iOSApplicationExtension / macOSApplicationExtension / watchOSApplicationExtension / tvOSApplicationExtension / swiftApplicationExtension
  • 모든 플랫폼에 적용하려면 *을 명시
  • 나머지 매개변수는 중요한 남김말이나 생명주기 등 추가 정보를 나타내기 위해 사용
    • unavailable : 해당 플랫폼에서 사용할 수 없는 선언. @available(tvOS, unavailable)
    • introduced : 이 선언이 어떤 버전에서 처음으로 작성되었는지 나타냄. @available(swift, introduced: 4.2)
    • deprecated : 이 선언이 어떤 버전에서 사용 중지되었는지 나타냄. @available(*, deprecated: 2.0.0)
      • 콜론과 버전 생략 가능
    • obsoleted : 이 선언이 어떤 버전부터 버려진 것인지 나타냄. @available(*, obsoleted: 2.0.0)
    • message : 사용이 제한되거나 불가능한 선언을 사용하려 할 때 컴파일러로 프로그래머에게 전달할 경고 또는 오류 메세지. 문자열 리터럴로 작성. @available(*, deprecated: 2.0.0, message: "deprecated since 2.0.0")
    • renamed: 해당 선언이 다른 이름으로 변경되었을 때 그 다른 이름을 나타냄. @available(*, deprecated: 2.0.0, message: "deprecated since 2.0.0", renamed: "NewClass")
  • 여러 플랫폼과 여러 매개변수를 동시에 전달할 수 있음. 추가 정보를 위한 매개변수가 명시되지 않았다면 항상 *로 끝마쳐야 함. @available(iOS 11, macOS 10.14, *)

discardableResult

  • 반환 값을 무시하고 싶을 때 컴파일러 경고가 발생하지 않도록 하기 위해 discardableResult 속성을 명시함

objc

  • Swift로 선언된 코드를 Objective-C의 코드에서 표현하고 사용할 수 있게 함
    • 중첩 타입, 제네릭 열거형 등은 objc 속성 사용 불가능
  • Objective-C 클래스를 반드시 상속받아야 함. 보통 NSObject
  • objc 속성이 부여된 클래스를 상속받는 클래스는 암시적으로 objc 속성이 부여됨
  • objc 속성이 부여된 프로토콜는 objc 속성이 부여되지 않은 Swift의 프로토콜을 상속받을 수 없음
  • objc 속성이 부여된 프로토콜을 상속받는 프로토콜은 암시적으로 objc 속성이 부여됨
  • 원시 값 타입이 Int인 열거형은 objc 속성을 부여하여 Objective-C 코드에서 사용 가능
    • Swift로 작성한 각 열거형 case의 이름은 Objective-C 코드에서는 Objective-C 스타일의 열거형 case 이름으로 나타남
      • Swift에서 School 열거형의 elementary case는 Objective-C에서 SchoolElementary라는 이름으로 나타남
  • 매개변수에 이름을 전달하여 해당 선언이 Objective-C에서 사용할 이름을 명시할 수 있음
    • 클래스 / 열거형 / 열거형 case / 프로토콜 / 메소드 / 접근자 / 설정자 / 이니셜라이저 등

nonobjc

  • 메소드, 프로퍼티, 서브스크립트, 이니셜라이저, 디이니셜라이저 등에 nonobjc 속성을 부여하여 Objective-C 코드에서 사용 불가능하게 함
  • nonobjc 속성을 부여받은 메소드는 objc 속성이 부여된 메소드로 재정의할 수 없음, objc 속성을 부여받은 프로토콜 요구사항을 충족할 수 없음

testable

  • 컴파일한 모듈에 정의한 내부 접근수준private 정의를 공개 접근수준open으로 정의한 것처럼 만들어줌
  • 외부에서 가져다 테스트할 수 있도록 함

objcMembers

  • 클래스 선언에 objcMembers 속성을 적용하여 클래스에 objc 속성을 부여할 수 있음. 클래스의 멤버, 익스텐션, 하위 클래스 및 익스텐션도 암묵적으로 Objective-C와 호환되게 함

타입 속성

타입에만 적용 가능

autoclosure

  • autoclosure 속성이 부여된 매개변수에 작성된 표현을 바로 실행하지 않고, 전달인자가 없는 클로저로 변경하고자 할 때 사용

convention

  • 함수의 타입이 어떤 호출 방식을 사용할지 결정.
  • 가능한 매개변수 목록
    • swift : Swift 함수 참조
    • block : Objective-C의 블록 객체 참조
    • c : C언어 함수의 참조

escaping

  • 메소드나 함수의 매개변수 타입에 escaping 속성을 사용하여 매개변수의 값이 나중에 실행되기 위해 어딘가로 다시 저장될 가능성이 있음을 나타냄
  • 함수나 메소드의 호출이 끝난 후에도 매개변수를 사용할 수 있음
  • 탈출 클로저

타입 별칭 및 호환 타입

Swift에서 많이 사용하는 타입이지만 실제로는 타입 별칭인 경우가 많음

C언어 등과 타입을 호환하기 위해 별칭으로 사용하는 타입도 있음

Codable

Codable & Decodable : 사용자 정의 데이터 타입을 다른 형식으로 쉽게 인코딩하고 디코딩할 수 있는 청사진을 제공하는 프로토콜

Foundation 프레임워크의 여러 클래스와 호환됨

Foundation 프레임워크의 클래스 효과
JSONEncoder / JSONDecoder Codable 프로토콜을 준수하는 타입의 데이터를 JSON 문자열로 변환하거나 JSON 문자열을 타입의 인스턴스로 변환
NSKeyedArchiver / NSKeyedUnarchiver Codable 프로토콜을 준수하는 타입의 데이터를 JSON 문자열로 변환하거나 JSON 문자열을 타입의 인스턴스로 변환
PropertyListEncoder / PropertyListDecoder Codable 프로토콜을 준수하는 타입의 데이터를 프로퍼티 리스트 데이터로 변환하거나 프로퍼티 리스트 데이터를 타입의 인스턴스로 변환
struct Person: Codable {
enum Gender: String, Codable {
case male, female, unknown
}
let name: String
let age: Int
let gender: Gender
let friends: [Person]
}

Codable 프로토콜을 채택하는 열거형도 정의 가능함. case는 문자열로 인코딩됨