스위프트: 가드렛 vs if let
, Swift의 Optionals의 를 본 .if let
는 Optional이 값을 보유하고 있는지 여부를 확인하기 위해 사용되며 값이 유지되는 경우 래핑되지 않은 값으로 작업을 수행합니다.
2.가 「Swift 2.0」이라고 을 본 적이 있습니다.guard let
주로 사용됩니다.if let
Swift 2.0은 Swift 2.0입니다.
다음을 포함하는 프로그램을 변경해야 합니까?if let
로로 합니다.guard let
if let
★★★★★★★★★★★★★★★★★」guard let
이치노
' 'guard
현재 범위를 종료해야 합니다.으로는, 「」, 「」, 「」, 「」를 호출할 것을 의미합니다.return
이치노 guard
는 기능의 나머지 부분을 네스트하지 않고 조기 복귀를 제공하기 위해 사용됩니다.
if let
그 범위를 내포하고 특별한 것을 필요로 하지 않습니다. 수 있다return
그렇지 않으면.
「」의 는,if-let
, 그 "block"은 "block"이 될이었습니다.else
절에는 다음과 같은 것이 있습니다.return
합니다.guard
은 ( 경험상) 의심스러울 (적어도) 자주 한다.guard
, 경우들이 있다.if let
여전히 적절합니다.
가드로 선명도 향상
가드를 사용하면 가드의 성공에 대한 기대가 훨씬 높아집니다.가드가 성공하지 못할 경우 스코프를 조기에 종료하는 것이 다소 중요합니다.파일/이미지가 존재하는지, 배열이 Empty인지 여부를 가드로 확인할 수 있습니다.
func icon() -> UIImage {
guard let image = UIImage(named: "Photo") else {
return UIImage(named: "Default")! //This is your fallback
}
return image //-----------------you're always expecting/hoping this to happen
}
위의 코드를 if-로 작성하면 판독 개발자에게 50대 50 이상의 값을 전달할 수 있습니다.하지만 가드를 사용하면 코드에 명료함을 더하고, 이것이 95%의 시간 동안 작동해야 한다는 것을 의미합니다. 만약 실패했다면, 왜 실패했을지 모르겠지만, 그럴 가능성은 매우 낮습니다.그 대신 이 기본 이미지를 사용하거나 잘못된 내용을 설명하는 의미 있는 메시지로 주장합니다.
guard
s 부작용이 발생할 경우 가드는 자연스러운 흐름으로 사용해야 한다.가드를 피하다else
조항은 부작용을 가져온다.가드가 코드가 올바르게 실행되기 위해 필요한 조건을 설정하여 조기 종료 가능분기에서 을 수행할 , 에서 리팩터링합니다.)를 합니다.
if
a까지guard
및 한다.else
삭제
송신원: 에리카 사둔의 스위프트 스타일 책
또, 상기의 제안과 클린 코드의 결과로서, 실패한 가드 스테이트먼트에 어설션을 추가할 필요가 있을 가능성이 높아집니다.그것은 가독성을 향상시켜, 다른 개발자에게 기대하는 것을 명확하게 합니다.
guard let image = UIImage(named: selectedImageName) else { // YESSSSSS assertionFailure("Missing \(selectedImageName) asset") return } guard let image = UIImage(named: selectedImageName) else { // NOOOOOOO return }
출처 : Erica Sadun의 Swift Style 책 + 일부 수정사항
if-let
것 을 참조해 주십시오.)
가드를 사용하는 것은 또한 파멸의 피라미드를 피함으로써 명확성을 향상시키는데 도움이 된다.니틴의 답을 보세요.
가드는 위반 요건을 처리하는 코드를 요건 옆에 보관합니다.
말하면, 「 」입니다.guard
성공과 실패가 항상 중요한 것은 아닙니다.보다 일반적인 방법은 위반된 요구사항과 위반되지 않은 프로세스 코드를 처리하는 것입니다.
예:
func getImage(completion: (image: Image)? -> Void) {
guard cache["image1"] == false else {
completion(cache["image1"]!)
}
downloadAndStore("image1") { image in
completion(image)
}
}
위의 경우 이미지가 캐시에 존재하지 않아야 합니다.이미지가 존재할 경우 당사의 요구 사항을 위반하게 됩니다.우리는 일찍 돌아간다.보시다시피 위반 코드 경로도 요건 바로 옆에 있습니다.즉, 다음과 같은 구조는 없습니다.
if requirement {
.
.
ten lines of code
.
.
} else {
handle requirement
}
Swift Docs on Control Flow에서는 그 이면에 대해 설명합니다.
요건에 대해 guard 문을 사용하면 if 문을 사용하여 동일한 체크를 수행하는 것에 비해 코드의 가독성이 향상됩니다.
- 일반적으로 실행되는 코드를 다른 블록에 줄이지 않고 쓸 수 있습니다.
- 위반된 요구 사항을 처리하는 코드를 요구 사항 옆에 유지할 수 있습니다.
가드는 현재 범위에서 새 변수를 생성하여 중첩을 방지합니다.
아무도 잘 설명하지 못한 중요한 차이점이 하나 있다.
다.guard let
★★★★★★★★★★★★★★★★★」if let
그러나 변수를 제거하다
★★★★★★★★★★★★★★★★ guard let
현재 범위에 존재할 새 변수를 만듭니다.
★★★★★★★★★★★★★★★★ if let
코드 블록 안에만 새 변수를 만드는 거야
guard let:
func someFunc(blog: String?) {
guard let blogName = blog else {
print("some ErrorMessage")
print(blogName) // will create an error Because blogName isn't defined yet
return
}
print(blogName) // You can access it here ie AFTER the guard statement!!
//And if I decided to do 'another' guard let with the same name ie 'blogName' then I would create an error!
guard let blogName = blog else { // errorLine: Definition Conflicts with previous value.
print(" Some errorMessage")
return
}
print(blogName)
}
if-let:
func someFunc(blog: String?) {
if let blogName1 = blog {
print(blogName1) // You can only access it inside the code block. Outside code block it doesn't exist!
}
if let blogName1 = blog { // No Error at this line! Because blogName only exists inside the code block ie {}
print(blogName1)
}
}
것은, 을 해 주세요.if let
다음 항목을 참조하십시오.옵션 바인딩을 재클라해도 오류가 발생하지 않는 이유
가드를 사용하려면 스코프를 종료해야 합니다.
(Rob Napier의 답변에도 기재되어 있습니다).
펑크 내부에 정의되어 있어야 합니다.주요 목적은 조건이 충족되지 않을 경우 범위를 중단/반환/종료하는 것입니다.
var str : String?
guard let blogName1 = str else {
print("some error")
return // Error: Return invalid outside of a func
}
print (blogName1)
기능 내부에 설치할 필요가 없습니다.
var str : String?
if let blogName1 = str {
print(blogName1) // You don't get any errors!
}
guard
»if
은 '보다 낫다'로 더 것 guard let
»if let
★★★★★★★★★★★★★★★★★」guard
»if
.
탠탠 a a aif
, 도 풀리지 guard
아래 예를 참조해 주세요.값이 다음과 같은 경우 조기 종료되지 않습니다.nil
값은 . 옵션 값은 없습니다.조건이 충족되지 않으면 일찍 종료됩니다.
let array = ["a", "b", "c"]
func subscript(at index: Int) -> String?{
guard index > 0, index < array.count else { return nil} // exit early with bad index
return array[index]
}
「 」를 if-let
사용 guard
종종 스타일의 문제입니다.
를 들어, '우리'가 있다고 .func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
항목 )var optionalArray: [SomeType]?
해서 반환을 합니다.0
가 「」인 nil
) (설정되지 않음)count
배열에 값이 있는 경우(설정되어 있는 경우.
다음과 같이 실장할 수 있습니다.
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
if let array = optionalArray {
return array.count
}
return 0
}
또는 다음과 같이 설정합니다.
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
guard let array = optionalArray else {
return 0
}
return array.count
}
이 예들은 기능적으로 동일합니다.
서 ★★★★★guard
데이터를 검증하는 등의 작업이 있을 때, 그리고 어떤 문제가 생겼을 때 그 기능이 조기에 실패하기를 바라는 경우입니다.
을 if-let
검증 완료에 가까워질수록 "성공 경로"와 현재 정상적으로 바인드된 옵션이 모두 메서드의 주요 범위에 포함됩니다.이는 장애 경로가 모두 이미 반환되었기 때문입니다.
몇 가지 (최적화되지 않은) 코드를 사용하여 guard 문의 유용성에 대해 설명하겠습니다.
이름, 성, 이메일, 전화 및 비밀번호를 사용하여 사용자 등록을 위한 텍스트 필드를 검증하는 UI가 있습니다.
textField에 유효한 텍스트가 포함되지 않은 경우 해당 필드를 firstResponder로 만들어야 합니다.
최적화되지 않은 코드를 다음에 나타냅니다.
//pyramid of doom
func validateFieldsAndContinueRegistration() {
if let firstNameString = firstName.text where firstNameString.characters.count > 0{
if let lastNameString = lastName.text where lastNameString.characters.count > 0{
if let emailString = email.text where emailString.characters.count > 3 && emailString.containsString("@") && emailString.containsString(".") {
if let passwordString = password.text where passwordString.characters.count > 7{
// all text fields have valid text
let accountModel = AccountModel()
accountModel.firstName = firstNameString
accountModel.lastName = lastNameString
accountModel.email = emailString
accountModel.password = passwordString
APIHandler.sharedInstance.registerUser(accountModel)
} else {
password.becomeFirstResponder()
}
} else {
email.becomeFirstResponder()
}
} else {
lastName.becomeFirstResponder()
}
} else {
firstName.becomeFirstResponder()
}
}
위에서 알 수 있듯이 모든 문자열(firstNameString, lastNameString 등)은 if 문의 범위 내에서만 액세스할 수 있습니다.따라서 이 "doom"이 생성되어 읽기 쉽고 이동하기 쉬운 등 많은 문제가 있습니다(필드의 순서가 변경된 경우 이 코드의 대부분을 다시 작성해야 합니다).
스테이트먼트를하면, 이 가드 「」( 「」)외에서 할 수 있는 을 알 수 .{}
을 사용법
// guard let no pyramid of doom
func validateFieldsAndContinueRegistration() {
guard let firstNameString = firstName.text where firstNameString.characters.count > 0 else {
firstName.becomeFirstResponder()
return
}
guard let lastNameString = lastName.text where lastNameString.characters.count > 0 else {
lastName.becomeFirstResponder()
return
}
guard let emailString = email.text where
emailString.characters.count > 3 &&
emailString.containsString("@") &&
emailString.containsString(".") else {
email.becomeFirstResponder()
return
}
guard let passwordString = password.text where passwordString.characters.count > 7 else {
password.becomeFirstResponder()
return
}
// all text fields have valid text
let accountModel = AccountModel()
accountModel.firstName = firstNameString
accountModel.lastName = lastNameString
accountModel.email = emailString
accountModel.password = passwordString
APIHandler.sharedInstance.registerUser(accountModel)
}
필드의 순서가 변경되었을 경우는, 코드의 각 행을 위아래로 이동하기만 하면, 조작할 수 있습니다.
이것은 매우 간단한 설명과 사용 사례입니다.이게 도움이 됐으면 좋겠네요!
기본적인 차이
가드렛
- 범위에서의 초기 프로세스
- '보다 낫다'와 같은 합니다.
return
,throw
syslog. - 범위 밖에서 액세스할 수 있는 새 변수를 만듭니다.
할 수만 있다면
- 범위외에 액세스 할 수 없습니다.
-
return
그런데 이렇게 쓸 수 요.
메모: 둘 다 Optional 변수의 래핑을 해제하기 위해 사용됩니다.
가드 렛 vs if 렛
func anyValue(_ value:String?) -> String {
guard let string = value else {
return ""
}
return string
}
func anyValue(_ value:String?) -> String {
if let string = value {
return string
}
return ""
}
가장 명확한 설명은 Github Swift Style Guide에 기재되어 있습니다.
if
깊이 수준을 추가합니다.
if n.isNumber {
// Use n here
} else {
return
}
guard
★★★★★★★★★★★★★★★★★★:
guard n.isNumber else {
return
}
// Use n here
A
guard
문은 하나 이상의 조건이 충족되지 않은 경우 프로그램 제어를 스코프 밖으로 전송하기 위해 사용됩니다.의 임의의 조건 값.
guard
는 「이어야 합니다.Bool
""에 입니다.Bool
조건에는 옵션의 바인딩 선언도 사용할 수 있습니다.
guard 문의 형식은 다음과 같습니다.
guard condition else {
//Generally return
}
- 옵션 바인딩으로도 인기가 있습니다.
- , 「」를 사용합니다.
if let
.
if let roomCount = optionalValue {
print("roomCount available")
} else {
print("roomCount is nil")
}
밥과 함께 이 사실을 빠르게 배웠어요
일반적인 기타 - If
func checkDrinkingAge() {
let canDrink = true
if canDrink {
print("You may enter")
// More Code
// More Code
// More Code
} else {
// More Code
// More Code
// More Code
print("Let me take you to the jail")
}
}
기타에 관한 문제: If
- 네스트 괄호
- 오류 메시지를 확인하려면 모든 행을 읽어야 합니다.
가드 스테이트먼트 가드블록은 조건이 false일 경우에만 실행되며 반환을 통해 함수에서 나옵니다.조건이 참일 경우 스위프트는 가드 블록을 무시합니다.조기 종료와 괄호 감소가 가능합니다.+
func checkDrinkProgram() {
let iCanDrink = true
guard iCanDrink else {
// if iCanDrink == false, run this block
print("Let's me take you to the jail")
return
}
print("You may drink")
// You may move on
// Come on.
// You may leave
// You don't need to read this.
// Only one bracket on the bottom: feeling zen.
}
else-If를 사용한 옵션 언랩
guard 문은 일반적인 조건부 블록을 else-if 문으로 대체하는 데 유용할 뿐만 아니라 괄호 수를 최소화하여 옵션 래핑 해제에도 유용합니다.비교하기 위해 먼저 여러 옵션을 else-if와 언랩하는 방법을 살펴보겠습니다.우선, 3개의 옵션을 작성해, 언랩 합니다.
var publicName: String? = "Bob Lee"
var publicPhoto: String? = "Bob's Face"
var publicAge: Int? = nil
최악의 악몽
func unwrapOneByOne() {
if let name = publicName {
if let photo = publicPhoto {
if let age = publicAge {
print("Bob: \(name), \(photo), \(age)")
} else {
print("age is mising")
}
} else {
print("photo is missing")
}
} else {
print("name is missing")
}
}
위의 코드는 확실히 작동하지만 DRY 원칙에 위배됩니다.끔찍하다.그것을 분해해 봅시다.+
조금 더 나은 아래 코드는 위보다 더 읽기 쉽습니다.+
func unwrapBetter() {
if let name = publicName {
print("Yes name")
} else {
print("No name")
return
}
if let photo = publicPhoto {
print("Yes photo")
} else {
print("No photo")
return
}
if let age = publicAge {
print("Yes age")
} else {
print("No age")
return
}
}
가드로 포장 해제 기타 문장은 가드로 대체할 수 있습니다.+
func unwrapOneByOneWithGuard() {
guard let name = publicName else {
print("Name missing")
return
}
guard let photo = publicPhoto else {
print("Photo missing")
return
}
guard let age = publicAge else {
print("Age missing")
return
}
print(name)
print(photo)
print(age)
}
여러 옵션의 래핑 해제(다른 옵션)-지금까지 옵션의 래핑을 하나씩 해제해 왔습니다.Swift를 사용하면 여러 옵션을 한 번에 풀 수 있습니다.둘 중 하나에 0이 포함되어 있으면 다른 블록이 실행됩니다.
func unwrap() {
if let name = publicName, let photo = publicPhoto, let age = publicAge {
print("Your name is \(name). I see your face right here, \(photo), you are \(age)")
} else {
// if any one of those is missing
print("Something is missing")
}
}
한 번에 여러 옵션의 래핑을 해제할 때 0이 포함된 옵션을 식별할 수 없습니다.
여러 옵션에서 가드를 풀고 물론 다른 옵션에서 가드를 사용해야 합니다.+
func unwrapWithGuard() {
guard let name = publicName, let photo = publicPhoto, let age = publicAge else {
// if one or two of the variables contain "nil"
print("Something is missing")
return
}
print("Your name is \(name). I see your, \(photo). You are \(age).")
// Animation Logic
// Networking
// More Code, but still zen
}
가드와 if 스테이트먼트의 주요 차이점은 다음과 같습니다.
- if 문은 조건이 충족될 때 코드를 실행하기 위해 사용됩니다.
- guard 문은 조건이 충족되지 않을 때 코드를 실행하기 위해 사용됩니다.
SwiftUI 가드는 Swift와 다릅니다.
아래와 같은 코드를 사용할 수 있습니다.
\n
func checkNil(stampd:Date?)->날짜 {guard stampd !=nill other {return Date() }return stampd?날짜() }
언급URL : https://stackoverflow.com/questions/32256834/swift-guard-let-vs-if-let
'programing' 카테고리의 다른 글
PowerShell의 여러 줄 댓글 (0) | 2023.04.22 |
---|---|
'[DBContext의 이름]' 형식의 개체를 만들 수 없습니다.설계 시 지원되는 다양한 패턴에 대하여 (0) | 2023.04.22 |
'npm'은 내부 또는 외부 명령, 작동 가능한 프로그램 또는 배치 파일로 인식되지 않습니다. (0) | 2023.04.22 |
열을 null로 변경 (0) | 2023.04.22 |
Windows 배치 파일의 한 줄에 여러 명령어가 표시됨 (0) | 2023.04.22 |