[swift] 기본문법(7)
ios/swift

[swift] 기본문법(7)

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