import UIKit
/*
17. 옵셔널 체이닝
옵셔널에 속해 있는 nil 일지도 모르는 프로퍼티, 메서드, 서브스크립션 등을
가져오거나 호출할 때 사용할 수 있는 일련의 과정
*/
struct Developer {
let name: String
}
struct Company {
let name: String
var developer: Developer?
}
var company = Company(name: "gunter", developer: nil)
print(company.developer) //nil
var developer = Developer(name: "han")
var company2 = Company(name: "james", developer: developer)
print(company2.developer) // "Optional(__lldb_expr_19.Developer(name: "han"))\n"
print(company2.developer?.name) // "Optional("han")\n" <- 옵셔널
print(company2.developer!.name) // "han\n" <- 옵셔널 강제 해제
/*
18.try-catch
*/
enum PhoneError: Error {
case unknown
case batteryLow(batteryLevel: Int)
}
// 오류발생 시키기
//throw PhoneError.batteryLow(batteryLevel: 20)
func checkPhoneBatteryStatus(batteryLevel: Int) throws -> String {
guard batteryLevel != -1 else { throw PhoneError.unknown }
guard batteryLevel > 20 else { throw PhoneError.batteryLow(batteryLevel: 20) }
return "배터리 상태가 정상입니다."
}
// do-catch
do {
try checkPhoneBatteryStatus(batteryLevel: 20)
} catch PhoneError.unknown {
print("알 수 없는 에러입니다.")
} catch PhoneError.batteryLow(let batteryLevel){
print("배터리 전원 부족. 남은 배터리: \(batteryLevel)")
} catch {
print("그 외 오류 발생 \(error)")
}
// try?
let status = try? checkPhoneBatteryStatus(batteryLevel: -1)
print(status) // nil
// try!
let status2 = try! checkPhoneBatteryStatus(batteryLevel: 30)
print(status2)
/*
19. 클로저
코드에서 전달 및 사용할 수 있는 독립 기능 블록이며, 일급 개체의 역할을 할 수 있음
일급객체란, 전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환 값이 될 수도 있다.
*/
let hello = { () -> () in
print("hello")
}
hello()
let hello2 = { (name:String) -> String in
return "Hello, \(name)"
}
hello2("james") // 매개변수명 쓰지 않고 바로 전달 hello2(name: "james") X
func doSomething(closure: ()->()){
closure()
}
doSomething(closure: { () -> () in
print("hello")
})
// 이렇게 간단하게도 쓸 수 있음
doSomething { // 단 하나의 클로저만 있는 경우는 소괄호도 생략 가능
print("hello2")
}
func doSomething2()->()->(){
return { () -> () in
print("hello4")
}
}
doSomething2()() // hello4
func doSomething2(success: () -> (), fail: () -> ()) {
}
func doSomething3(closure: (Int, Int, Int) -> Int) {
closure(1,2,3)
}
doSomething3 {
$0+$1+$2 // code 부분에 return 한 줄만 있으면 return 도 생략 가능
}
/*
20.고차함수
다른 힘수를 전달 인자로 받거나 함수 실행의 결과를 함수로 반환하는 함수
*/
// a. map => 자바스크립트랑 똑같음
let numbers = [0,1,2,3]
let mapArray = numbers.map{ (number) -> Int in
return number*2
}
print("mapArray: \(mapArray)") // [0,2,4,6]
// b. filter => 자바스크립트랑 똑같음
let intArray = [10,5,20,13,4]
let filterArray = intArray.filter { $0 > 5 } // 클로저 표현 간소화 방법
print("filterArray: \(filterArray)")
// c. reduce => 자바스크립트랑 똑같음
let someArray = [1,2,3,4,5]
let reduceResult = someArray.reduce(0) {
(result: Int, element: Int) -> Int in
print("\(result) + \(element)")
return result + element
}
print("reduce: \(reduceResult)")
- 클로저 부분은 생소해서 추가로 공부가 필요할 것 같다!
- 고차함수 부분은 원리가 자바스크립트랑 똑같다!
반응형
'ios > swift' 카테고리의 다른 글
[swift] 기본문법(6) (0) | 2021.11.09 |
---|---|
[swift] 기본문법(5) (0) | 2021.11.08 |
[swift] 기본문법(4) (0) | 2021.11.07 |
[swift] 기본문법(3) (0) | 2021.11.06 |
[swift] 기본문법(2) (0) | 2021.11.06 |