Ios IF LET vs GUARD LET中的Return语句
请看以下两个代码相同的场景: 使用IF LET:Ios IF LET vs GUARD LET中的Return语句,ios,swift3,Ios,Swift3,请看以下两个代码相同的场景: 使用IF LET: public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?){ if let error = error { print("error: \(error.localizedDescription)") return } for service in peripheral.se
public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?){
if let error = error {
print("error: \(error.localizedDescription)")
return
}
for service in peripheral.services!
{
print("discovered service is ::::",service)
}
}
public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?){
guard let _ = error else{
for service in peripheral.services!
{
print("discovered service is ::::",service)
}
return
}
}
使用保护LET:
public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?){
if let error = error {
print("error: \(error.localizedDescription)")
return
}
for service in peripheral.services!
{
print("discovered service is ::::",service)
}
}
public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?){
guard let _ = error else{
for service in peripheral.services!
{
print("discovered service is ::::",service)
}
return
}
}
他们都使用返回语句
,两个语句的用途相同。那么有什么区别,哪一个更好?
编辑:-
问题是对于一般性陈述,使用其中任何一个都可以,但当我们处理错误时,哪一个最好使用?在这种情况下使用
guard
可以让您的意图更清楚,您只希望在没有错误的情况下执行函数
我最喜欢guard
的地方是它避免了深入嵌套if
括号,从而使代码更具可读性。然而,在您的代码中,为了实现这一点,您应该将其设置为如下格式:
guard error != nil else { return }
... // continue with regular code
除此之外,
guard
和如果
产生相同的结果,那主要是口味的问题 守卫声明非常适合对付“末日金字塔”。我使用它的方式是,例如键盘通知:
func keyboardWillShowSelector(notification:NSNotification) {
guard let userInfo = notification.userInfo else { return }
var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
keyboardFrame = self.view.convert(keyboardFrame, from: nil)
let height = keyboardFrame.size.height
keyboardWillShow(withHeight: height)
}
如果没有guard语句,它将有另一个意图,代码也不会如此干净:
func keyboardWillShowSelector(notification:NSNotification) {
if let userInfo = notification.userInfo {
var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
keyboardFrame = self.view.convert(keyboardFrame, from: nil)
let height = keyboardFrame.size.height
keyboardWillShow(withHeight: height)
}
}
另一个很好的例子是验证:
private func errorFromInputValidation(name: String, email: String, password1: String, password2: String) -> String? {
guard password1 != "" && password2 != "" && email != "" && name != "" else { return Localizable.fieldsCannotBeEmpty.localized }
guard password1 == password2 else { return Localizable.passwordsAreNotEqual.localized }
return nil
}
首先,它们都没有得到适当的实施
- 在
peripheral.services中代码>如果
将为零,它将崩溃服务
- Return语句-这两种语句都不需要返回,如果let,只需将其从
中删除,一切都会正常工作
优于guard
的好处是它减少了if-let
括号,从而产生更多的可读代码if-else
- 使用
如果您关心块范围外变量的值,请考虑guard
您只能在块内使用未包装变量如果let
- 如果让用于少量变量展开,则使用
,并且在块范围外不需要展开变量的值
- 使用
在块范围外使用未包装变量guard else
- 如果要使用块范围外的
对象(主要使用保护块),则使用error
否则使用guard else
If let
服务
是可选的,所以您应该用打开它,如果让它
或保护其他
得到它,但问题是一般声明,它是好的,但当我们处理错误时,哪一个最好使用?问题是一般声明,它是好的,但当我们处理错误时,什么是最好使用的?这取决于,您可以使用if和guard实现所有功能。这只是为了使代码更干净。问题是对于一般语句来说,这是可以的,但当我们处理错误时,最好使用什么呢?