Language/Swift 수업

iOS 프로그래밍 기초 (3)

비코딩 2021. 9. 17. 05:20

옵셔널(optional) : 값이 있을수도 없을수도(nil) 있음

Int

var x : Int = 10

 

Optional Int

var y : Int? = 10

var z : Int!

 

var a : Int = 10
print(a)
// 10

var b : Int? = 20
print(b)
// Optional(20)

var c : Int?
print(c)
// nil

 

옵셔널 타입

 값을 반환할 때 오류가 발생할 수 있는 값을 옵셔널 타입이라는 객체로 반환

print(Int("99"))
// Optional(99)

print(Int("hello"))
// nil

 

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

Optional(99) 처럼 옵셔널 변수에 값이 있으면 옵셔널로 '래핑(wrapped)' 되었다고 한다.

강제 언래핑(forced unwrapping)으로 풀 수 있다.

var a : Int?
a = 3
print(a,a!)	
// Optional(3) 3
var b : Int?
print(b!)	// Error
var a : String?
a = "값이 있음"
if a != nil {
    print(a!)
}
else {
    print("값이 없음(nil)")
}
// 값이 있음

var b : String?
if b != nil{
    print(b!)
}
else {
    print("값이 없음(nil)")
}
// 값이 없음(nil)

옵셔널 바인딩(optional binding) - 강제 언래핑하는 다른 방법

옵셔널에 할당된 값을 임시 변수나 상수에 할당

var a : Int?
a = 100
if var aa = a {
    print(a, aa)
}
else {
    print("nil")
}
// Optional(100) 100

var b : Int?
if var bb = b {
    print(bb)
}
else {
    print("nil")
}
// nil
var operate1 : String?
var operate2 : String?
operate1 = "open"
operate2 = "close"
if let firstOperate = operate1, let secondOperate = operate2 {
    print(firstOperate, secondOperate)
}
else {
    print("nil")
}
// open close​

 

Optinal 형 : Int!

옵셔널이 항상 유효한 값을 가질 때 옵셔널이 암묵적인 언래핑이 되도록 선언 가능

let a : Int! = 5    // Optional(5)
let b : Int = a     // 5 (Optional로 사용되지 않아서 자동으로 unwrap)
let c : Int = a!    // 5 (강제 언래핑한 값을 저장)
let d = a           // Optional(5) (Optional로 사용가능)
let e = a + 2       // 7 (unwrapping해서 사용할 수 있기 때문에 unwrap)
print(a,b,c,d,e) // Optional(5) 5 5 Optional(5) 7
print(type(of:a),type(of:b),type(of:c),type(of:d),type(of:e))
// Optional<Int> Int Int Optional<Int> Int

 

 

형변환 as(upcasting)

  • 상속 관계가 있는 클래스들끼리만 type casting 가능
  • as 연산자를 이용한 타입 변환(type casting) - 자식인스턴스 as 부모클래스 (upcasting)

 

형변환 as!, as?(downcasting)

  • 부모 인스턴스를 자식 클래스로 변환하는데 사용
  • as! 는 downcasting 강제 변환 (downcasting 성공 확신이 있을 때)
  • as? 는downcasting 옵셔널 타입으로 변환 (downcasting 성공 확신이 없을때, 변환이 안되면 nil을 리턴하기 때문)

 

AnyObject (protocol)

  • 어떠한 클래스 타입의 인스턴스도 표현 가능
  • 상속관계가 아니여도 타입 캐스팅이 가능한 타입
  • 어떤 클래스의 객체도 저장 가능
  • 클래스만 허용, 구조체나 열거형은 X

Any

  • 클래스, 구조체, 열거형, 함수 타입도 표현 가능

 

범위 연산자

  • 닫힌 범위 연산자 : 1...5 (1부터 5까지 1,2,4,3,5)
  • 반 열린 범위 연산자  : 1..<5 (1부터 5미만까지 1,2,3,4)
  • One-Sided Ranges 
  • let priority = ["fisrt","second","third","fourth"] for order in priority [...1] { print(order) } // fisrt // second​

 

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

let defaultAddress = "none"
var address : String?
address = "Seoul"
print(address)  // optional("Seoul")
var myAddress = address ?? defaultAddress
print(myAddress)    // Seoul

 

while 문

var countDown = 10
while countDown > 0 {
    print(countDown)
    countDown-=1
}
// 10 9 8 7 6 5 4 3 2 1

repeat-while 문 : 적어도 한번은 실행

var countDown = 10
repeat {
    countDown-=1
    print(countDown)
} while (countDown>0)
// 9 8 7 6 5 4 3 2 1 0

break  

for i in 1..<10 {
    if i > 5 {
    break
    }
    print(i)
}
// 1 2 3 4 5

* if문 실행문장이 한 줄이라도 { } 작성

 

if문 조건에서 ,(콤마)의 의미

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 문 : BMI 계산 결과 판정

let weight = 58.0
let height = 168.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:20.549886621315192, 판정:정상

 

[iOS프로그래밍기초(21-2학기)한성현교수님 강의 내용 변형 및 요약]