🖌 타입
- Int / UInt
- Float / Double
- Character / String
- Bool
- Any / AnyObject
- nill
var someInt: Int = -100
var someUInt: UInt = 100
var someFloat: Float = 3.14
var someDouble: Double = 3.14
someFloat = 3 (o)
someDouble = 3 (o)
someDouble = someFloat (x)
var someCharacter: Character = "🇰🇷"
## someCharacter = "😄"
someCharacter = "가"
someCharacter = "A"
someCharacter = "하하하"
var someString: String = "하하하 😄 "
someString = someString + "웃으면 복이와요"
someString = someCharacter
var longString: String = """
동해물과 백두산이 마르곡 닳도록
하느님이 보우하사 우리나라 만세
"""
var someBool: Bool = true
someBool = false
var someAny: Any = 100
someAny = "어떤 타입도 수용 가능합니다"
someAny = 123.12
let someDouble: Double = someAny
class SomeClass {}
var someAnyObject: AnyObject = SomeClass()
someAnyObject = 123.12
없음을 의미하는 키워드
🥊 상수
- var : 값의 변경을 허락하는 타입, 초기값 없이 선언되면 옵셔널로 간주
- let : 초기에 선언 된 값 이외에 변경을 허락 안하는 타입
🏈 변수보다는 상수를 사용할 것은 권장
- Swift는 데이터 타입이 안전한 프로그래밍 언어
- 변수의 데이터 타입이 한번 정해지면 그변수는 다른 타입의 데이터를 저장하는데 사용 될 수 없고, 컴파일 에러를 발생
var temp : Int = 10
var temp1 = 10
let temp2 : Int = 20
let temp3 = 20
let temp4 : String
temp4= "Hello Swift!"
⚽️ 튜플
- 다른 타입들의 데이터들을 배열처럼 저장할 수 있음
- 하나의 함수에서 여러 값을 반환 할 수 있다는 것이 강력한 기능
let myTuple = (10, 11.23, "Welcome Tuple!")
let temp = myTuple.2
print(temp)
let (myInt, myDouble, myString) = myTuple
let (myInt, _ , myString) = myTuple
let myTuple = (10, 11.23, "Welcome Tuple!")
let myTuple1 = (count:10, length:11.23, message<:"Welcome Tuple!")
print(myTuple1.length)
🌝 옵셔널 타입
- 변수, 상수에 값이 할당되지 않은 상황을 처리하기 위해 안전하고 일관된 접근 방식을 제공하는 것
- 변수 선언시, 데이터 타입 선언 다음에 ? 문자를 입력
var index: Int?
- index 변수에는 값이 있을 수도 없을 수도 있음
- nil이라는 값을 저장하고 있음
- 옵셔널에 값이 할당되었다면 "래핑되었다(wrapped)" 라고 부름
- 옵셔널에 래핑된 값을 사용, 즉 옵셔널 변수의 값을 사용할 때는 "강제 언래핑"을 통해 접근
- 느낌표 !를 두어 추출
var index: Int?
index = 3
print(index)
print(index!)
var nameList = ["lee","kim","park","jung"]
if index != nil {
print(nameList[index!])
} else {
print("index does not contain a value!!")
}
- 옵셔널 바인딩 : 옵셔널로 할당된 값을 임시 변수나 상수에 할당하는 것
var index : Int?
index = 3
var nameList = ["lee","kim","park","jung"]
if let myValue = index{
print(nameList[myValue])
}else{
print("index does not contain a value!!")
}
- 위 코드에서 사용한 myValue는 if 구문에서만 유효한 것
- 따라서 옵셔널로 할당된 동일한 이름을 사용해도 충돌이 발생하지 않음
...
if let index = index{
print(nameList[index])
}else{
print("index does not contain a value!!")
}
- 옵셔널 바인딩은 여러 개의 옵셔널을 언래핑하고 조건문을 포함하는데 사용
var pet1 : String?
var pet2 : String?
pet1 = "cat"
pet2 = "dog"
if let pet1 = pet1, let pet2 = pet2{
print(pet1)
print(pet2)
} else {
print("insufficient pets")
}
- 강제적으로 언래핑되도록 옵셔널을 선언 가능
- 이 방식은 옵셔널을 선언하면 강제 언래핑이나 옵셔널 바인딩을 하지 않아도 값에 접근 가능
- 옵셔널을 선언할 때 !표로 강제 언래핑되도록하는 것
var index : Int!
index = 3
var nameList = ["lee","kim","park","jung"]
if index != nil {
print(nameList[index])
}else{
print("index does not contain a value!!")
}
- 할당된 값이 없거나 nil을 할당 할 수 있는 것은 "옵셔널 타입"뿐!!
var myInt = nil
var myString : String = nil
let myConstant = nil
⚡️ 타입 캐스팅과 타입 검사
- 코드를 작성할 때 컴파일러가 어떤 값의 특정 타입을 식별하지 못하는 경우가 발생
- 메서드나 함수가 반환하는 값이 불명확하거나 예상되지 않은 타입의 값일 때 발생
- as 키워드를 사용하여 코다가 의도하는 값의 타입을 컴파일러가 알 수 있게 해야한다
- 이것이 타입캐스팅(Type Casting)이다
- 업캐스팅은 괜찮으나 다운캐스팅은 문제 발생가능성이 있다
- 다운캐스팅을 강제로 하기 위해서는 as! 키워드를 사용한다
- 안전하게 하는 방법은 as? 키워드를 사용한 옵셔널 바인딩을 하는 것
ex) let myValue = record.object(forKey:"comment") as! String