Int
, 부동 소수점에 대한 Double
및 Float
, 부울 값에 대한 Bool
및 텍스트 데이터에 대한 String
을 포함하여 C와 Objective-C 모든 기초 타입을 자체 버전에 맞게 제공합니다. Swift는 또한 콜렉션 타입 (Collection Types)에서 자세히 다룰 Array, Set, 그리고 Dictionary 인 3개의 기본 콜렉션 타입을 제공합니다.String
을 요구하는 코드에서 실수로 Int
로 전달하는 것을 막아줍니다. 마찬가지로 옵셔널이 아닌 String
을 요구하는 코드에 옵셔널 String
을 전달하는 것을 막아줍니다. 타입 세이프티는 개발 단계에서 가능한 빠르게 에러를 찾고 고칠 수 있게 도와줍니다.maximumNumberOfLoginAttempts
또는 welcomeMessage
)과 특정 타입 (숫자 10
또는 문자열 "Hello"
와 같은 타입)의 값을 연결합니다. 상수 (Constant) 의 값은 최초 지정 후 변경이 불가능하지만 변수 (Variable) 는 다른 값으로 변경이 가능합니다.let
키워드와 함께 선언하고 변수는 var
키워드와 함께 선언합니다. 다음의 예제는 상수와 변수를 사용하여 어떻게 사용자 로그인 시도 횟수를 추적하는지를 보여줍니다:maximumNumberOfLoginAttempts
인 새로운 상수를 선언하고 10
이라는 값을 설정합니다. 그리고 currentLoginAttempt
인 새로운 변수를 선언하고 0
이라는 값으로 초기화 하였습니다."NOTE 코드에서 저장한 값이 변경되지 않는다면 항상let
키워드로 상수로 선언해야 합니다. 변수는 오직 값을 저장하고 변경이 필요할 때 선언합니다.
welcomeMessage
라는 변수에 String
값을 저장할 수 있는 변수를 나타내는 타입 명시를 제공합니다:welcomeMessage
라고 하며 이것의 타입은 String
입니다."String
입니다." 라는 의미는 "어떤 String
값은 저장 가능합니다." 입니다. 저장할 수 있는 "어떠한 타입" (또는 "어떠한 종류") 라고 생각하십시오.welcomeMessage
변수는 아무런 오류 없이 어떠한 문자열 값을 지정할 수 있습니다:NOTE 실제로 타입 명시가 필요한 경우는 드뭅니다. 상수 또는 변수를 선언할 때 초기값을 지정하면 Swift는 타입 세이프티와 타입 추론 (Type Safety and Type Inference) 에서 나와있는대로 해당 상수 또는 변수에 사용될 타입을 거의 항상 유추할 수 있습니다. 위의welcomeMessage
예제에서 초기값을 지정하지 않았으므로welcomeMessage
변수의 타입은 초기값에서 유추되지 않고 타입을 명시 하였습니다.
NOTE Swift 키워드와 동일한 이름의 상수 또는 변수를 제공해야 한다면 이름을 백틱 (`)으로 묶어야 합니다. 그러나 선택의 여지가 없을때까지는 키워드를 이름으로 사용하지 말아야 합니다.
friendlyWelcome
값은 "Hello!"
에서 "Bonjour!"
변경됩니다:print(_:separator:terminator:)
함수로 상수 또는 변수의 현재 값을 출력할 수 있습니다:print(_:separator:terminator:)
함수는 하나 또는 그 이상의 값을 적절하게 출력하는 전역 함수입니다. 예를 들어 Xcode에서 print(_:separator:terminator:)
함수는 Xcode "콘솔 (console)" 창에 결과를 출력합니다. separator
와 terminator
파라미터는 기본 값을 가지고 있으므로 함수를 호출할 때 생략할 수 있습니다. 기본적으로 이 함수는 줄바꿈을 출력하고 종료됩니다. 줄바꿈 없이 값을 출력하려면 예를 들어 print(someValue, terminator: "")
와 같이 terminator
에 빈 문자열을 넘겨주면 됩니다. 파라미터 기본값에 대한 자세한 내용은 파라미터 기본 값 (Default Parameter Values) 을 참고 바랍니다.//
)로 시작합니다:/*
) 로 시작하고 애스터리스크 뒤에 슬래시 (*/
)로 끝납니다:;
)은 필수조건이 아닙니다. 그러나 여러 구문을 한줄로 작성할 경우 세미콜론은 필수로 작성되어야 합니다:42
와 -23
과 같은 분수가 아닌 전체 숫자입니다. 정수는 부호가 있는 정수 (signed) (양수, 0, 또는 음수) 또는 부호가 없는 정수 (unsigned) (양수 또는 0) 이 있습니다.UInt8
그리고 32-bit 부호가 있는 정수는 Int32
와 같이 C와 비슷한 네이밍 형태를 가집니다. Swift의 모든 타입과 마찬가지로 정수 타입은 대문자로 시작합니다.min
과 max
프로퍼티를 통해 각 정수 타입의 최소값과 최대값을 가져올 수 있습니다:UInt8
)이므로 동일한 타입의 다른 값과 함께 표현식에 사용될 수 있습니다.Int
인 정수 타입을 제공합니다:Int
는 Int32
와 같은 크기를 가짐Int
는 Int64
와 같은 크기를 가짐Int
를 사용하십시오. 이것은 코드 일관성과 상호 운용성을 지원합니다. 32-bit 플랫폼에서도 Int
는 -2,147,483,648
과 2,147,483,647
사이의 값을 저장할 수 있으며 일반적인 사용성에 문제가 없습니다.UInt
인 정수 타입을 제공합니다:UInt
는 UInt32
와 같은 크기를 가짐UInt
는 UInt64
와 같은 크기를 가짐NOTEUInt
는 플랫폼의 네이티브 사이즈와 같은 크기의 부호없는 정수 타입이 필요한 경우에만 사용하십시오. 저장될 값이 음수가 아니어도Int
를 더 선호합니다. 정수값에Int
를 일관되게 사용하면 코드 상호 운용성을 지원하고 타입 세이프티 와 타입 유추 (Type Safety and Type Inference)에 설명 된대로 다른 숫자 형식간에 변환 할 필요가 없습니다.
3.14159
, 0.1
, 및 -273.15
와 같은 분수 성분을 가진 숫자입니다.Int
보다 더 크거나 작은 값 저장이 가능합니다. Swift는 2개의 부호를 가진 부동 소수점 숫자 타입을 제공합니다:Double
은 64-bit 부동 소수점 숫자를 표기Float
는 32-bit 부동 소수점 숫자를 표기NOTEDouble
은 최소 15자리의 소수점 정확도를 가지고 있는것에 반해Float
는 더 적은 6자리의 정확도를 가집니다. 사용할 적절한 부동 소수점 타입은 코드에서 작업해야하는 값의 특성과 범위에 따라 다릅니다. 두 타입 중에는Double
이 선호됩니다.
String
이 필요한 경우 실수로 Int
를 전달할 수 없습니다.Int
라고 추론합니다:Double
이라고 추론합니다:Float
보다 Double
을 선택합니다.Double
타입으로 유추합니다:3
인 리터럴 값에는 명시적인 타입이 없으므로 추가로 부동 소수점 리터럴이 존재하는 경우 Double
이 유추됩니다.0b
접두사로 2진수0o
접두사로 8진수0x
접두사로 16진수17
의 값을 가집니다:0x
) 일 수 있습니다. 소수점 양쪽에 항상 숫자 (또는 16진수)가 있어야 합니다. 10진수는 대문자 또는 소문자 e로 표시되는 지수 를 가질 수도 있습니다. 16진수는 대문자 또는 소문자 p로 표시되는 지수 를 가질 수도 있습니다.exp
인 10진수는 기본 숫자에 1.25e2
는 1.25 x 125.0
1.25e-2
는 1.25 x 0.0125
exp
인 16진수는 기본 숫자에 0xFp2
는 15 x 60.0
0xFp-2
는 15 x 3.75
12.1875
를 가집니다:Int
타입을 사용합니다. 일반적인 상황에서 기본 정수 타입을 사용하는 것은 정수 상수와 변수가 코드에서 즉시 상호 운용 가능하며 정수 리터럴 값의 유추 된 타입이 일치한다는 것을 의미합니다.Int8
상수 또는 변수는 -128
과 127
사이의 숫자를 저장할 수 있는 반면에 UInt8
상수 또는 변수는 0
과 255
사이의 숫자를 저장할 수 있습니다. 크기가 지정된 정수 타입의 상수 또는 변수에 맞지않는 숫자는 컴파일 시에 오류가 발생합니다:twoThousand
는 UInt16
타입인 반면에 상수 one
은 UInt8
타입입니다. 두 상수는 타입이 다르기 때문에 직접 더할 수 없습니다. 대신 이 예제에서 UInt16(one)
을 호출하여 one
의 값을 새로운 UInt16
으로 초기화하면 기존 값 대신에 새로운 값을 사용합니다:UInt16
이므로 덧셈은 이제 제대로 동작합니다. 출력 상수 (twoThousandAndOne
)은 두 UInt16
값을 더하므로 UInt16
타입으로 유추됩니다.SomeType (ofInitialValue)
는 Swift 타입의 초기화를 호출하고 초기화 값을 전달하는 기본적인 방법입니다. 이전에 UInt16
은 UInt8
값을 허용하는 초기화가 있으므로 초기화는 기존 UInt8
에서 새 UInt16
을 만드는데 사용됩니다. 그러나 UInt16
이 제공하는 초기화 타입 이외에는 전달할 수 없습니다. 기존 타입을 확장하여 새로운 타입 (자신이 정의한 새로운 타입)을 받아들이는 초기화를 제공하는 것은 확장 (Extensions) 에서 다룹니다.three
는 타입 Double
의 새로운 값으로 생성하는데 사용되어 덧셈의 양쪽이 동일한 타입입니다. 이 변환이 없으면 덧셈이 허용되지 않습니다.Double
또는 Float
로 초기화 될 수 있습니다:4.75
는 4
, 그리고 -3.9
는 -3
이 된다는 의미입니다.NOTE 숫자 상수와 변수를 결합하는 규칙은 숫자 리터럴 규칙과 다릅니다. 리터럴 값3
은 숫자 리터럴에 명시적인 타입이 없으므로 리터럴 값0.14159
에 직접 추가할 수 있습니다. 이것의 타입은 컴파일러가 실행되는 시점에서만 유추됩니다.
typealias
키워드를 사용하여 정의할 수 있습니다.AudioSample
은 UInt16
의 별칭으로 정의됩니다. 별칭이므로 AudioSample.min
에 대한 호출은 실제로 UInt16.min
을 호출하며 maxAmplitudeFound
변수의 초기값은 0
입니다.Bool
이라 불리는 기본 부울 (Boolean) 타입 이 있습니다. 부울 값은 오직 참 또는 거짓 값만 가지므로 _논리적 (logical)_으로 참조됩니다. Swift는 2개의 부울 상수 값인 true
와 false
를 제공합니다:orangesAreOrange
와 turnipsAreDelicious
의 타입은 부울 리터럴 값으로 초기화 되어 Bool
로 유추되었습니다. 위의 Int
와 Double
에서와 같이 상수 또는 변수를 초기화 시 true
또는 false
로 선언하면 상수 또는 변수를 Bool
타입으로 선언할 필요가 없습니다. 타입 유추는 Swift 코드가 이미 알고 있는 타입의 다른 값으로 상수 또는 변수를 초기화시에 더 간결하고 읽기 쉽습니다.if
구문과 같은 조건문으로 동작할 때 특히 유용합니다:Bool
로 대체되는 것을 방지합니다. 아래 예제는 컴파일 시 에러를 발생합니다:i == 1
비교 결과는 Bool
타입이므로 이 두번째 예제는 타입 검사를 정상적으로 수행할 수 있습니다. i == 1
과 같은 비교는 기본 연산자 (Basic Operators) 에서 설명합니다.(404, "Not Found")
는 HTTP 상태 코드 (HTTP status code) 를 나타내는 튜플입니다. HTTP 상태 코드는 웹 페이지를 요청할 때마다 웹 서버가 반환하는 특정 값입니다. 404 Not Found
상태 코드는 요청한 웹 페이지가 존재하지 않을 때 반환됩니다.(404, "Not Found")
튜플은 HTTP 상태 코드에 2개의 개별 값인 숫자와 사람이 읽을 수 있는 설명을 제공하는 Int
와 String
을 함께 그룹화하여 제공합니다. 이것은 "튜플의 타입은 (Int, String)
" 이라고 설명할 수 있습니다.(Int, Int, Int)
또는 (String, Bool)
또는 실제로 필요한 다른 어떠한 것도 만들 수 있습니다._
)로 튜플의 일부를 무시할 수 있습니다:(Int, String)
튜플 타입을 반환할 수 있습니다. 이 함수는 각각 다른 타입의 2가지 고유한 값으로 튜플을 반환함으로써 단일 타입의 단일 값만 반환할 수 있는 경우보다 유용합니다. 자세한 내용은 반환값이 여러개인 함수 (Functions with Multiple Return Values) 를 참조 바랍니다.NOTE 튜플은 관련된 값의 간단한 그룹에 유용합니다. 복잡한 데이터 구조를 생성하는데는 맞지 않습니다. 데이터 구조가 복잡한 경우 튜플이 아닌 클래스 (class) 또는 구조체 (structure)를 사용하십시오. 자세한 내용은 구조체와 클래스 (Structures and Classes) 를 참조 바랍니다.
NOTE 옵셔널의 개념은 C 또는 Objective-C 에는 존재하지 않는 개념입니다. Objective-C에서 가장 가까운 것은 객체를 반환하는 메서드에서nil
(유효한 객체가 없음)을 반환하는 것입니다. 그러나 이것은 오직 객체에 대해서만 동작하고 구조체, 기본 C 타입, 또는 열거형 값에서는 동작하지 않습니다. 이러한 타입의 경우 Objective-C 메서드는 일반적으로 값이 없음을 나타내는NSNotFound
와 같은 특수한 값을 반환합니다. 이러한 방법은 메서드 호출자가 특수한 값에 대해 대응하고 체크해야 된다는 것을 알고 있다고 가정합니다. Swift의 옵셔널은 특수한 상수 없이 어떠한 타입 에 대해서 값이 없음을 나타낼 수 있습니다.
Int
타입은 String
값을 Int
값으로 변환하는 초기화가 존재합니다. 그러나 모든 문자열을 정수로 변환할 수 없습니다. 문자열 "123"
은 숫자값 123
으로 변환될 수 있지만 문자열 "hello, world"
는 변환할 숫자값이 없습니다.String
을 Int
로 초기화하는 것을 보여줍니다:Int
가 아닌 옵셔널 Int
를 반환합니다. 옵셔널 Int
는 Int
가 아닌 Int?
로 작성합니다. 물음표는 값의 포함여부가 옵셔널이라는 것을 나타내고 옵셔널이란 어떠한 Int
값이 있거나 값이 없을 수 있다는 의미입니다 (여기서는 Bool
값 또는 String
값을 포함할 수 없고 Int
이거나 아무런 값이 없을 수 있습니다).nil
로 지정하여 값이 없는 상태를 나타낼 수 있습니다:NOTE 옵셔널이 아닌 상수와 변수에는nil
을 사용할 수 없습니다. 코드에서 상수 또는 변수가 값이 없는 상태에서 동작이 필요하다면 항상 해당 타입의 옵셔널 값으로 선언해야 합니다.
nil
로 설정됩니다:NOTE Swift의nil
은 Objective-C의nil
과 다릅니다. Objective-C에서의nil
은 존재하지 않는 객체에 대한 포인터입니다. Swift에서의nil
은 특정 타입의 값이 없음을 나타내며 포인터가 아닙니다. 객체 타입 뿐만 아니라 모든 타입의 옵셔널을nil
로 설정할 수 있습니다.
if
구문은 옵셔널과 nil
을 비교하여 옵셔널에 값이 포함되어 있는지 확인할 수 있습니다. "같음" 연산자 (==
) 또는 "같지 않음" 연산자 (!=
)로 비교를 수행할 수 있습니다.nil
과 "같지 않음"으로 간주됩니다:!
)를 추가하여 값에 접근할 수 있습니다. 여기서 느낌표란 "이 옵셔널은 확실히 값을 가지고 있습니다. 사용해도 괜찮습니다."라는 의미입니다. 이것을 옵셔널의 값에 대한 강제로 풀기 (forced unwrapping) 라 합니다:NOTE!
를 사용하여 값이 없는 옵셔널에 사용하면 런타임 에러가 발생합니다. 항상!
를 사용하여 값을 강제로 풀기 전에 옵셔널에nil
이 아닌 값이 있다는 것을 확실시 해야 합니다.
if
와 while
구문에서 옵셔널에 값이 있는지 체크하고 단일 동작의 일부로 상수 또는 변수로 추출할 수 있습니다. if
와 while
구문은 제어 흐름 (Control Flow) 에서 자세히 다룹니다.if
구문에서 옵셔널 바인딩은 아래와 같이 사용합니다:possibleNumber
를 다시 작성할 수 있습니다:Int(possibleNumber)
에 의해 반환된 옵셔널 Int
에 값이 포함되어 있으면 actualNumber
라는 새로운 상수에 옵셔널에 포함된 값을 설정합니다."actualNumber
상수는 if
구문에 첫번째 중괄호 내에서 사용할 수 있습니다. actualNumber
상수는 이미 옵셔널 _안_에 값을 가지고 초기화 되었으며 값에 접근하기 위해 !
접미사를 사용할 필요가 없습니다. 이 예제에서 actualNumber
는 간단하게 변환 결과를 출력하는데 사용됩니다.myNumber
가 값이 있는지 없는지를 먼저 확인합니다. myNumber
가 값이 있다면 해당 값이 새로운 myNumber
라는 상수에 설정됩니다. if
구문 안에서 myNumber
는 새로운 옵셔널이 아닌 상수를 참조합니다. if
구문 전과 후에는 myNumber
는 옵셔널 정수 상수를 참조합니다.if
구문에 첫번째 중괄호에서 myNumber
의 값을 변경하고 싶다면 if var myNumber
로 대신 쓸 수 있으며 옵셔널에 포함된 값은 상수가 아닌 변수로 사용할 수 있습니다. if
구문내에서 myNumber
를 바꾸면 이것은 지역 변수에만 적용되며, 기존 언래핑된 옵셔널 상수 또는 변수에 적용되지 않습니다.if
구문에 쉼표로 구분하여 옵셔널 바인딩 및 부울 조건을 여러개 포함할 수 있습니다. 옵셔널 바인딩 값 중 하나가 nil
이거나 부울 조건이 false
로 판단되면 전체 if
구문의 조건은 false
로 간주됩니다. 다음의 예는 같은 if
구문입니다:NOTEif
구문에서 옵셔널 바인딩으로 생성된 상수와 변수는 오직if
구문의 본문 안에서만 사용가능합니다. 반면에guard
구문으로 생성된 상수와 변수는 이른 종료 (Early Exit) 에 설명된 것처럼guard
구문 다음 코드 라인부터 사용 가능합니다.
if
구문에서 체크할 수 있고 값이 존재한다면 옵셔널 값에 접근하기위해 옵셔널 바인딩을 이용할 수 있습니다.String?
)를 작성하는 대신에 느낌표 (String!
) 로 암시적으로 언래핑된 옵셔널을 작성합니다. 사용할 때 옵셔널 이름의 뒤에 느낌표를 위치시키는 것보다 선언할 때 옵셔널 타입 뒤에 느낌표를 위치시키는 것이 더 좋습니다.String
로서 랩핑된 값에 접근할 때 옵셔널 문자열과 암시적으로 언래핑된 옵셔널 문자열의 동작 차이를 보여줍니다:assumedString
은 implicitString
이 명시적으로 옵셔널이 아닌 String
타입이기 때문에 implicitString
에 값을 할당하기 전에 강제로 언래핑 됩니다. 아래의 코드에서 optionalString
은 명시적 타입이 없으므로 기본적으로 옵셔널입니다.nil
이고 래핑된 값에 접근하려고 하면 런타임 에러가 발생합니다. 이 결과는 값이 없는 옵셔널 뒤에 느낌표를 배치한 것과 같습니다.nil
체크를 할 수 있습니다:NOTE 나중에 변수가nil
이 될 가능성이 있다면 암시적으로 언래핑된 옵셔널을 사용하지 말아야 합니다. 변수의 수명에 따라nil
값을 확인해야 한다면 항상 기본 옵셔널을 사용해야 합니다.
throws
키워드를 포함시켜 에러가 발생할 수 있음을 나타냅니다. 에러를 발생할 수 있는 함수를 호출할 때는 표현식 앞에 try
키워드를 붙여야 합니다.catch
절에 의해 처리될 때까지 현재 범위에서 에러를 자동으로 전파합니다.do
구문은 에러를 하나 이상의 catch
절로 전파할 수 있는 새로운 범위를 만듭니다.makeASandwich()
함수는 깨끗한 그릇을 사용할 수 없거나 재료가 없는 경우 에러가 발생할 것입니다. makeASandwich()
함수는 에러를 발생할 수 있으므로 try
표현식으로 래핑됩니다. 함수 호출을 do
구문으로 래핑하면 어떠한 에러도 catch
절로 전파됩니다.eatASandwich()
함수가 호출됩니다. SandwichError.outOfCleanDishes
에러가 발생하면 washDishes()
함수가 호출됩니다. SandwichError.missingIngredients
에러가 발생하면 catch
패턴에 의해 캡쳐된 [String]
값과 함께 buyGroceries(_:)
함수가 호출됩니다.true
이면 코드는 평소와 같이 진행됩니다. 조건이 false
로 판단되면 프로그램의 현재 상태는 유효하지 않아 코드 실행은 종료되고 앱은 종료됩니다.assert(_:_:file:line:)
함수로 주장을 작성할 수 있습니다. 이 함수에 true
또는 false
로 판단될 표현식과 조건이 false
일 경우 출력될 메세지를 전달합니다. 예를 들어:age
가 음수가 아니고 age >= 0
이 true
일 경우 이어서 실행됩니다. age
가 음수이면 age >= 0
은 false
가 되고 주장은 실패되고 애플리케이션은 종료됩니다.precondition(_:_:file:line:)
함수로 전제조건을 작성할 수 있습니다. 이 함수에 true
또는 false
로 판단될 표현식과 조건이 false
일 경우 출력될 메세지를 전달합니다. 예를 들어:preconditionFailure(_:file:line:)
함수를 호출하여 실패가 발생했음을 알릴 수 있습니다. 예를 들어 유효한 데이터는 switch 의 default 케이스가 아닌 다른 케이스에서 처리되어야 합니다.NOTE 체크하지 않는 모드 (-Ounchecked
)로 컴파일하면 전제조건은 체크하지 않습니다. 컴파일러는 전제조건은 항상 참이라고 가정하고 코드에 알맞게 최적화 합니다. 그러나fatalError(_:file:line:)
함수는 최적화 설정과 무관하게 항상 중지를 실행합니다.프로토타입과 초기 개발단계에서 아직 구현되지 않은 기능에서fatalError(_:file:line:)
을 사용할 수 있으며fatalError("Unimplemented")
와 같이 작성할 수 있습니다. 주장 또는 전제조건과 다르게 치명적인 에러는 절대 최적화 되지 않기 때문에 이 구현을 만나면 항상 중지됩니다.