Swift 2.0 오류 처리(하)

3695 단어
이전 기사에서 우리는 Swift 2.0 오류 처리의 기본적인 용법을 배웠다.
이 글은 Swift 2.0이 오류 처리에 협조하는 두 가지 새로운 키워드deferguard를 계속 소개할 것이다.

defer

defer 키워드는 코드를 감싸는 데 사용할 수 있으며, 이 코드 블록은 현재 역할 영역이 끝날 때 호출됩니다.이것은 열려 있는 파일을 닫는 등 현재 코드를 정리하는 데 사용된다.
같은 역할 영역에서 여러 개의 defer 코드 블록을 지정할 수 있으며, 현재 역할 영역이 끝날 때, 그들은 상반된 순서로 호출된다. 즉, 먼저 정의한 다음에 실행하고, 다음에 정의한 다음에 실행하는 것이다.
예를 들어 다음 코드는 다음과 같습니다.
openFile()
defer {
    // defer block 1
    closeFile()
}

startPortListener(42)
defer {
   // defer block 2
   stopPortListener(42)
}

이 코드는 작용역이 끝날 때 두 번째 defer 블록은 먼저 호출되고 그 다음에 첫 번째 defer 블록을 호출한다.

guard

guard 키워드는 if와 비슷하지만 작용은 상반된다.우리는 보통 if를 사용하여 자신이 원하는 조건을 선택하고, guard는 원하지 않는 조건을 선택한다.
예를 들어 어떤 프로그래머 클럽은github에 있는 스타 수가 200보다 적은 사람은 들어갈 수 없다고 규정하고 있다.if로 판단하면 코드는 다음과 같습니다.
if star < 200 {
    return
}
guard를 사용하는 경우 다음을 수행해야 합니다.
guard star >= 200 else {
    return
}

선택할 수 있는 유형의 귀속에 있어 guard 키워드의 장점이 더욱 뚜렷하다.다음 코드에서는 두 가지 방법을 비교합니다.
var star: Int?

if let star = star {
    // star             
}

guard let star = star else {
    return
}
//           ,star        

세그먼트 코드에서 볼 수 있듯이 일반if-let을 사용하여 선택할 수 있는 유형을 귀속시키면 우리는 if 문장의 괄호 안에서 정상적인 상황을 처리해야 하고 밖에서 잘못된 상황을 처리해야 한다는 것을 의미한다.이것은 우리의 직관적인 느낌(특히 강박증 환자)과 맞지 않는다.그러나 guard를 사용하면 우리는 빈 선택 가능한 값을 미리 판단한 다음에 미리 종료할 수 있다. 오류 판단 후의 코드star는 모두 해제된 것이기 때문에 안심하고 사용할 수 있다.

Show me the code


이전 글의 데모를 계속 사용합니다. 이전 장의 전체 코드는 저의github에서 다운로드할 수 있습니다. 파일 이름은 01-ErrorHandling.playground 입니다.starterShelf 함수 앞에 두 함수의 정의를 추가합니다.
func beginReceipt() {
    print("        ,        ")
}

func endReceipt() {
    print("    ,      ")
}

이어서 purchaseBooks 방법을 호출하기 전에 방금 정의한 두 함수를 호출합니다.
do {
    beginReceipt()
    
    try shelf.purchaseBooks(2500)
    
    endReceipt()
} catch BookShelfError.NoEnoughSpace(let required) {
    print("    ,        。  \(required)   ,        ")
}

이전 함수의 정보만 인쇄된 것을 알 수 있다. 그것은 purchaseBooks 방법을 실행할 때 오류가 발생했고 프로그램의 제어 프로세스가 catch 코드 블록으로 옮겨졌고 두 번째 함수는 실행되지 않았기 때문이다.defer를 사용하여 endReceipt의 역할역이 끝나기 전에 호출할 수 있습니다.
do {
    beginReceipt()
    defer {
        endReceipt()
    }
    
    try shelf.purchaseBooks(2500)
} catch BookShelfError.NoEnoughSpace(let required) {
    print("    ,        。  \(required)   ,        ")
}

지금 우리가 어떤 서점에서 몇 권의 책을 구매할 것인지를 저장하기 위해 사전을 사용한다면 다음 코드를 do의 정의 아래에 추가하십시오.
let shopList = ["    ": 250]
BookShelfError를 호출할 때, 먼저 purchaseBooks에서 구매할 수량을 꺼냅니다.

do {
    // ...

    let buyCount = shopList["    "]
    try shelf.purchaseBooks(buyCount)
} 

직접 이렇게 호출하면 컴파일러가 오류를 보냅니다. 사전 형식이 shopList 선택할 수 있는 형식으로 되돌아오기 때문에 직접 사용할 수 없습니다.
여기, Int? 키워드가 도움이 될 수 있습니다.
do {
    // ...

    guard let buyCount = shopList["    "] else {
        fatalError()
    }
    
    try shelf.purchaseBooks(buyCount)
} 

이때 프로그램은 정상적으로 운행할 수 있다.
연습자로서 guardpurchaseBooks 두 가지 방법 정의 중의 lendBooks를 사용if으로 바꿀 수 있다. 이것은 매우 간단하기 때문에 여러분에게 직접 시도해 보도록 하겠습니다.
이 편의 전체 코드는 나의github에서 다운로드할 수 있다.

좋은 웹페이지 즐겨찾기