문법_타입,상수, 그리고 변수

Rio·2021년 7월 9일
0

IOS

목록 보기
2/10

🖌 타입

  • Int / UInt
  • Float / Double
  • Character / String
  • Bool
  • Any / AnyObject
  • nill
// Int , UInt(양의 정수)
var someInt: Int = -100
var someUInt: UInt = 100

// Float , Double
var someFloat: Float = 3.14
var someDouble: Double = 3.14
someFloat = 3 (o)
someDouble = 3 (o)
someDouble = someFloat (x)// 컴파일 오류발생

// Character , String 
// 유니코드 사용, 둘다 "" 사용
var someCharacter: Character = "🇰🇷"
## someCharacter = "😄"
someCharacter = "가"
someCharacter = "A"
someCharacter = "하하하" // 컴파일 오류발생

var someString: String = "하하하 😄 "
someString = someString + "웃으면 복이와요"
someString = someCharacter // 컴파일 오류발생

//""" """를 사용하면 단락으로 문장입력 가능
var longString: String = """
동해물과 백두산이 마르곡 닳도록
하느님이 보우하사 우리나라 만세
"""

// Bool
var someBool: Bool = true
someBool = false

// Any , AnyObject
var someAny: Any = 100
someAny = "어떤 타입도 수용 가능합니다"
someAny = 123.12

//Any 타입에 Double 자료를 넣어두었더라도 Any는 Double 타입이 아니기 때문에 할당할 수 없음. 명시적으로 타입을 변환 필수
let someDouble: Double = someAny  // 컴파일 오류발생

//모든 클래스 타입을 지칭하는 프로토콜
class SomeClass {}
var someAnyObject: AnyObject = SomeClass()
//AnyObject는 클래스의 인스턴스만 수용 가능. 클래스의 인스턴스가 아니면 할당할 수 없음.
someAnyObject = 123.12    // 컴파일 오류발생

//nil
없음을 의미하는 키워드

🥊 상수

  • 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) // Welcome Tuple! 출력

//튜플에 저장된 값을 한번에 추출 가능
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 = nil
index = 3
print(index) // Opitional(3) 출력 -> 값을 사용할 수 없음, ni은 아님
print(index!) // 3 출력 -> 값을 사용가능
//활용
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
profile
우당탕탕 개발 기록지

0개의 댓글