2015-11-17 53 views
-1

通過拆我有這個功能,使用guard以確保參數正確:在後衛條款

func foo(bundle: NSBundle?, _ url: NSURL?)->Bool{ 

    guard let _ = url, let _ = bundle else{ 
     print("crap") 
     return false 
    } 


    return true 
} 

我注意到else子句就會執行,如果任何參數是零。它表現爲一個OR子句。

但是,我需要檢查的是兩者都是零(一個)。

我該怎麼做?

回答

2

如果你不真正關心你的綁定值(我假設你不這樣做,鑑於_名),你可以這樣做:

func foo(bundle: NSBundle?, _ url: NSURL?) -> Bool { 
    guard url != nil || bundle != nil else { 
     print("crap") 
     return false 
    } 

    return true 
} 

如果你真的想綁定值,那麼您無法通過單個guard聲明完成此操作。如果您未注意到任何一個選項的值,那麼它將執行else塊,如您所注意的那樣。

如果您還在使用警戒聲明,您必須按照上面的說明加入警惕聲明,然後根據需要使用各種if let聲明來解包事物(或者只是省略警惕聲明並在聲明中包含else聲明)下面的代碼是假的情況):

func foo(bundle: NSBundle?, _ url: NSURL?) -> Bool { 
    guard url != nil || bundle != nil else { 
     print("crap") 
     return false 
    } 

    if url == nil, let someBundle = bundle { 
     // Handle the bundle only case 
    } 
    else if bundle == nil, let someUrl = url { 
     // Handle the url only case 
    } 
    else if let someUrl = url, let someBundle = bundle { 
     // Handle the case for both 
    } 

    return true 
} 
0

這不是一個真正的警衛聲明的工作。你想要的是:

if(url == nil && bundle == nil) 
{ 
    print("crap") 
    return false 
} 
return true