정수형 데이터 타입
- 부호 있는 정수(signed) : 양수, 음수, 0 값 저장
- 부호 없는 정수 (unsigned) : 양수, 0 값 저장
정수 지원
- 8비트, 16비트 ,32비트, 64비트 지원
- Int8, Int16, Int32, Int64
- 부호 없는 비트 : UInt8, UInt16, UInt32, UInt64
→ Int 데이터 타입 사용 권장 : 코드가 실행되는 플랫폼에 맞는 정수 크기를 사용
- 모든 정수형 데이터 타입은 해당 데이터 타입이 지원하는 최댓값, 최솟값을 알 수 있도록 범위 속성을 가짐
print("Int32 Min = \(Int32.min) Int32 Max = \(Int32.max)")
// Int32 Min = -2147483648 Int32 Max = 2147483647
부동소수점 데이터 타입
- Float : 최대 32비트의 부동소수점 수 저장하기 위해 사용 (적어도 6자리)
- Double : 최대 64비트의 부동소수점 수 저장하기 위해 사용 (적어도 15자리), Default
불리언 데이터 타입
- Boolean : true, false 제공
문자 데이터 타입
- 스위프트에서 문자는 내부적으로 그래핌 클러스터의 형태로 저장
- 그래핌 클러스터 : 눈에 보이는 하나의 문자를 표현하기 위해 결합된 둘 이상의 유니코드 스칼라로 구성
var myChar1 = "f"
var myChar2 = ":"
var myChar3 = "X"
var myChar4 = "\u{0058}" // "X"
문자열 데이터 타입
- 내부적으로 문자들의 집합으로 표시, 문자는 하나 이상의 유니코드 스칼라 값
- 문자열 보간이라는 개념을 이용하여 변수, 상수, 표현식, 함수 호출을 조합하여 구성 가능
var userName = "John"
var inboxCount = 25
let maxCount = 100
var message = "\(userName) has \(inboxCount) messages. Message capacity remaining is \(maxCount-inboxCount) messages"
print(message)
// John has 25 messages. Message capacity remaining is 75 messages
- 여러줄의 문자열은 삼중 따옴표 사용
- 각 줄의 들여쓰기는 들여쓰기된 만큼에서 마지막 닫는 삼중 따옴표가 들여쓰기된 만큼을 뺀 양으로 계산
var multiline = """
The console glowed
Clealy Time was running out.
"I thought you said"
"""
print(multiline)
/*
The console glowed
Clealy Time was running out.
"I thought you said"
*/
특수 문자/이스케이프 시퀀스
var newline = "\n" // 개행 문자
var backslash = "\\" // "\"
/*
\n : 개행
\r : 캐리지 리턴
\t : 탭
\\ : 역슬래시
\" : 쌍따옴표
\' : 홑따옴표
*/
타입 선언과 타입 추론
- 스위프트는 데이터 타입이 안전한 프로그래밍 언어
- 변수의 데이터 타입이 한 번 정해지면 다른 타입의 데이터는 저장할 수 없음
var userCount : Int = 10
- 타입 추론
- 변수 또는 상수가 초기화되는 시점에 할당된 값의 타입을 판단하여 해당 타입으로 지정
- 타입 선언 없이 상수를 선언하게 될 경우, 반드시 선언 시점에서 값을 할당해야 함
- 하지만, 상수 선언 시 타입 선언을 사용하면 나중체 초기자에서 할당 가능
var signalStrength = 2.331 // Double 타입으로 간주
let conpanyName = "My Company" // String 타입으로 간주
let bookTitle : String
if false{
bookTitle = "SwiftUI"
}else{
bookTitle = " Andorid"
}
튜플
- 여러 값을 하나의 항목으로 임시적으로 그루핑하는 방법
- 서로 다른 타입의 값들이 튜플에 저장 가능
- 인덱스 위치를 사용하여 접근 가능
let myTuple = (10, 432.443, "This is String")
let myString = myTuple.2
print(myString) // This is String
- 하나의 구문으로 튜플에 있는 모든 값을 추출하여 변수 또는 상수에 각각 할당하는 방법
- 선택 추출 방법
let (myInt, myDouble, myStr) = myTuple
print(myInt, myDouble, myStr) // 10 432.443 This is String
var (myInt, _, myStr) = myTuple
- 튜플 생성 시점에 각각의 변수 할당 가능
let myTuple = (count :10, length : 432.433, message : "This is a String")
print(myTuple.length) // 432.433
→ 튜플이 가진 강력한 기능 : 하나의 함수에서 여러 값을 반환 가능
옵셔널 타입
- 목적 : 변수 또는 상수에 값이 할당되지 않은 상황을 처리하기 위해 안전하고 일관된 접근 방식 제공
- 변수 선언 시, 데이터 타입 선언 다음 ‘?’ 문자를 두어 옵셔널이 되게 함
- 어떤 값도 할당되지 않은 옵셔널은 실제로 nil 값을 가짐
var index : Int?
- 만약 옵셔널 값이 할당되었으면 해당 값이 옵셔널 내에서 ‘래핑되었다’ 고 말함
- 옵셔널 안에 래핑된 값을 사용할 때는 ‘강제 언래핑’이라는 개념을 이용한다
- 래핑된 값은 옵셔널 데이터 타입에서 옵셔널 이름 뒤에 느낌표(!)를 두어 추출
var index : Int?
index = 3
var treeArray = ["Oak", "Pine", "Yew", "Birch"]
if index != nil{
print(treeArray[index!])
}else{
print("index does not contain a value")
}
// Birch
→ print(treeArray[index]) (느낌표 제거 시 에러 발생)
error: DataType.xcplaygroundpage:74:21: error: value of optional type 'Int?' must be unwrapped to a value of type 'Int'
print(treeArray[index])
- 옵셔널 바인딩
- 지정된 옵셔널이 값을 가지고 있는지 확인
- 옵셔널 변수가 값을 가지고 있는 경우 그 값을 변수 또는 상수에 할당하고 코드 실행
var index : Int?
index = 3
var treeArray = ["Oak", "Pine", "Yew", "Birch"]
// 옵셔널 바인딩
if let myValue = index {
print(treeArray[myValue])
} else{
print("index does not contain a value")
}
// Birch
- myValue 상수는 if문 내에서만 사용 가능
타입 캐스팅과 타입 검사
- 컴파일러가 어떤 값의 특정 타입을 식별하지 못하는 경우 발생
- 이런 경우는 메서드나 함수가 반환하는 값이 불명확하거나 예상되지 않은 타입의 값일 때 발생함
- as 키워드를 사용하여 코드가 의도하는 값의 타입을 컴파일러가 알 수 있게 함 → 타입 캐스팅(형 변환)
- object(forKey:) 메서드가 반환하는 값을 String 타입으로 처리해야 한다고 알려주는 코드
let myValue = record.object(forKey: "comment") as! String
- 업캐스팅
- 특정 클래스의 객체가 상위 클래스들 중 하나로 변형되는 것
- as 키워드를 사용하여 수행
- 변환이 성공할 것이라고 컴파일러가 알려줄 수 있기에 보장된 변환이라고 함
- UIButton 클래스는 UIControl 클래스의 하위 클래스 → 안전하게 업캐스팅 가능
let myButton : UIButton = UIButton() let myControl = myButton as UIControl
- 다운 캐스팅
- 어떤 클래스에서 다른 클래스로 만드는 변환이 일어날 때 발생
- 안전하게 수행되거나 유효하지 않은 변환 시도를 컴파일러가 보장할 수 없음
- 어떤 클래스에서 그 클래스의 하위 클래스로 변환
- as! 키워드 사용 (강제 변환)
- UIScrollView 클래스는 UITableView, UITextView 클래스라는 하위 클래스를 가짐
- UIScrollView 객체를 UITextView 클래스로 변환하기 위해서는 다운 캐스팅 필요함
let myScrollView : UIScrollView = UIScrollView() let myTextView = myScrollView as UITextView // 컴파일 에러 발생 (안정성 보장 X) let myTextView = myScrollView as! UITextView // 컴파일은 되지만, 실행 중에 충돌 발생
- 안전한 방법은 as? 를 사용한 옵셔널 바인딩
- 변환이 수행되면 지정한 타입의 옵셔널 값이 반환되며, 오류 발생한 경우 nil
import UIKit let myScrollView : UIScrollView = UIScrollView() if let myTextView = myScrollView as? UITextView{ print("type cast to UITextView succeeded") } else{ print("type cast to UITextView failed") } // type cast to UITextView failed
- 타입 검사
- is 키워드 사용
- 해당 객체(myobject)가 MyClass 라는 이름의 클래스의 인스턴스인지 검사하는 코드
if myobject is MyClass { //myobject는 MyClass의 인스턴스이다. }
'Swift' 카테고리의 다른 글
Swift - 3. 제어 흐름 (0) | 2023.12.26 |
---|---|
Swift - 2. 연산자와 표현식 (0) | 2023.12.24 |
Swift - Dictionary (0) | 2023.09.02 |
Swift - HIG (Human Interface Guide) (0) | 2023.08.28 |
Swift - Extension (확장) (0) | 2023.08.24 |