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학기)한성현교수님 강의 내용 변형 및 요약]