Swift 2.0 오류 처리(하)
이 글은 Swift 2.0이 오류 처리에 협조하는 두 가지 새로운 키워드
defer
와 guard
를 계속 소개할 것이다.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)
}
이때 프로그램은 정상적으로 운행할 수 있다.
연습자로서
guard
와 purchaseBooks
두 가지 방법 정의 중의 lendBooks
를 사용if
으로 바꿀 수 있다. 이것은 매우 간단하기 때문에 여러분에게 직접 시도해 보도록 하겠습니다.이 편의 전체 코드는 나의github에서 다운로드할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.