iOS 프로그래밍기초 수업 4주차

도연·2022년 9월 26일
0
post-thumbnail

🥇 옵셔널(optional)


🥈 옵셔널 타입

  • 값을 반환할 때 오류가 발생할 가능성이 있는 값은 옵셔널 타입이라는 객체로 감싸서 반환함
print(Int("12"))
print(Int("Hi"))
// Optional(12)
// nil
  • Swift에서 기본 자료형(Int, Double, String 등)은 nil값을 저장할 수 없음
  • nil을 저장하려면 옵셔널 타입으로 선언해야 함
  • 옵셔널 타입은 변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위한 방법 제공
  • 옵셔널 타입 변수를 선언하기 위해서는 타입 선언부 뒤에 “?” 문자를 씀 ( 주의 : 변수명 뒤에 "?" 하는것 아님)

🥈 옵셔널 타입 강제 언래핑(forced unwrapping) 1

  • 옵셔널 변수에 값이 있으면 옵셔널로 "래핑되었다(wrapped)"고 함
  • 옵셔널에 래핑된 값은 강제 언래핑(forced unwrapping)으로 풀어줌
var x : Int? //옵셔널 정수형 변수 x 선언
var y : Int = 0
x = 10 // 주석처리하면?
print(x) // Optional(10)
print(x!) // forced unwrapping해서 10이 나옴
print(y)

// x = x+2  // 불가능 -> x = x!+2 로 변경해야함 
// print(x)
// y = x    // 불가능 -> y = x! 로 변경
// print(y)

🥈 옵셔널 변수에 초기값을 안주면??

  • nil 값이 나옴

🥈 forced unwrapping : 옵셔널 변수 뒤에 !

주의 : if x!=nil 이라고 쓰면 안됨

var x : Int?
x = 10
if x != nil {
print(x!)
}
else {
print("nil")
}
var x1 : Int? //nil
if x1 != nil {
print(x1!)
}
else {
print("nil")
} 

// 실행결과
10
nil

🥈 옵셔널 타입 강제 언래핑(forced unwrapping) 2 : optional binding

  • 강제 언래핑하는 또 다른 방법으로, 옵셔널 바인딩(optional binding)을 이용하여 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당
var x : Int?
x = 10        // if let x = x 라고 써도 됨

if let xx = x { //옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행
  print(x, xx)
} 
else {
  print("nil")
}
var x1 : Int?
if let xx = x1 { //옵셔널 변수 x1이 값이 없어서 if문의 조건이 거짓이 되어 if문 실행하지 않고 else로 감
  print(xx)
} 
else {
  print("nil")
}

// 실행결과 
Optional(10) 10
nil

🥈 여러 옵셔널을 언래핑

여러 옵셔널 변수를 한번에 언래핑하는 방법은 콤마 사용

var pet1: String?
var pet2: String?
pet1 = "cat"
pet2 = "dog"
if let firstPet = pet1, let secondPet = pet2 {
   print(firstPet, secondPet)
} else {
  print("nil")
}

// 실행결과 : cat dog
--------------------------------------------------------

var x : Int?
var y : Int?
x = 10
y = 20
if let xx = x, let yy = y {
    print(xx,yy)
}
else {
    print("nil")
}

// 실행결과 : 10 20

🥈 두 가지 옵셔널 타입

  • 옵셔널이 항상 유효한 값을 가질 경우 옵셔널이 암묵적인 언래핑(implicitly unwrapped)이 되도록 선언할 수도 있음
  • 클래스의 아웃렛 변수 초기화에서 많이 사용(자동 생성되는 코드)

🥈 옵셔널 사용 이유?

  • 옵셔널 타입만이 값을 갖지 않는다는 의미의 nil 값을 가질 수 있음

🥈 형 변환(as로 upcasting : 자식인스턴스를 부모클래스로 변환)

  • 상속 관계가 있는 클래스들끼리만 타입 캐스팅 가능
  • 자식(부모로부터 상속받아 더 많은 것을 가지고 있음)인스턴스를 부모로 캐스팅하는 것은 문제가 없음

🥈 범위 연산자

  • 닫힌 범위 연산자(closed range operator)

    • x...y
      • x에서 시작하여 y로 끝나는 범위에 포함된 숫자
    • 5…8
      • 5, 6, 7, 8
  • 반 열린 범위 연산자(half-open range operator)

    • x..<y
      • x부터 시작하여 y가 포함되지 않는 모든 숫자
    • 5..<8
      • 5, 6, 7

One-Sided Ranges
let names = ["A", "B", "C", "D"]
for name in names[2...] { //[...2], [..<2] //과제: 실행 결과
print(name)
} // C
// D

🥈 Nil-Coalescing Operator (Nil합병연산자) ??

var x: Any = "Hi"
print(x, type(of:x))
x = 10
print(x, type(of:x))
x = 3.5
print(x, type(of:x))
//type을 검사해서 사용

// 실행결과
Hi String
10 Int
3.5 Double

🥇 제어문

🥈 for-in 반복문

for _ in 1...5 {
  print("안녕", terminator:" ")
}

for i in 1...5 {
  print("\(i) 안녕")
}

// 실행결과
안녕 안녕 안녕 안녕 안녕 1 안녕
2 안녕
3 안녕
4 안녕
5 안녕

🥈 반복문에서 빠져나오기(break)

for i in 1..<10 {
 if i > 5 break   
// error: expected '{' after 'if' condition
 print(i) 
}
----------- 수정 후------------------

for i in 1..<10 {
 if i > 5 { break } // 중괄호 추가   

 print(i) 
}

🥈 if문 조건에서 콤마의 의미(중요)

  • if문에서 콤마는 AND(&&)의 의미
var a = 1
var b = 2
var c = 3
var d = 4
if a < b && d > c {
    print("yes")
}
if a < b, d > c { 
    print("yes")
}

// 실행결과 
yes
yes

🥈 if-else 문

  • if 문의 다른 변형으로, if 문의 표현식이 거짓(false)으로 평가될 경우에도 수행될 코드를 지정

🥈 다중 if-else문 : BMI 계산 결과 판정 -> switch-case 문으로 변경해보기

let weight = 90.0
let height = 180.0
let bmi = weight / (height*height*0.0001) // kg/m*m 
var body = "" 

if bmi >= 40 { 
 body = "3단계 비만"
} else if bmi >= 30 && bmi < 40 {
 body = "2단계 비만"
} else if bmi >= 25 && bmi < 30 {
 body = "1단계 비만"
} else if bmi >= 18.5 && bmi < 25 {
 body = "정상"
} else {
 body = "저체중" 
}

print("BMI:\(bmi), 판정:\(body)")

// 실행결과 : BMI:27.777777777777775, 판정:1단계 비만
let weight = 90.0
let height = 180.0
let bmi = weight / (height*height*0.0001) // kg/m*m 
var body = ""

switch bmi{
case 40...:
  body = "3단계 비만"
case 30..<40:
  body = "2단계 비만"
case 25..<30:
  body = "1단계 비만"
case 18.5..<25:
  body = "정상"
default:
  body = "저체중"
}
print("BMI:\(bmi), 판정:\(body)")

// 실행결과 : BMI:27.777777777777775, 판정:1단계 비만
	출처:iOS프로그래밍기초 (22-2학기)한성현교수님 강의 내용 변형 및 요약 3주차
profile
초보개발자..ㅠ

0개의 댓글