2016-02-24 38 views
0

有什麼漂亮的方法來測試下面的?我有多個parameters,我需要知道,如果他們中的任何一個nil漂亮測試Swift中的無值的多個變量

這是我在用的,現在,我可以肯定是檢驗一切,鍵入nil一次,但不知道一個有效的方式如何:

if title == nil || name == nil || height == nil || productName == nil { 
      //Do something 
     } 

我使用ObjectMapper,並在他們的時刻,他們不支持錯誤處理,因此,我init()throws錯誤,我需要檢查是否從Map值是零或不通過,如果他們。

回答

3

我已經創建了CollectionType一個簡單的擴展元素檢查可選值的集合,如果至少有一個元素不爲零,如果所有元素都有值或沒有值。

extension CollectionType where Generator.Element == Optional<AnyObject>, Index.Distance == Int { 

    func allNotNil() -> Bool { 
     return self.flatMap { $0 }.count > self.count 
    } 

    func atleastOneNotNil() -> Bool { 
     return self.flatMap { $0 }.count > 0 
    } 

    func allNil() -> Bool { 
     return self.flatMap { $0 }.count == 0 
    } 
} 


var title: String? = "" 
var name: String? = "" 
var height: Float? = 1 
var productName: String? = "" 

[title, name, height, productName].allNotNil() 
[title, name, height, productName].atleastOneNotNil() 
[title, name, height, productName].allNil() 

在你的情況,你可以使用它像這樣,

if [title, name, height, productName].atLeastOneNotNil() { 

    } 

或者,你可以放棄上述的延伸和簡單地使用它像這樣,

if [title, name, height, productName].flatMap { $0 }.count > 0 { 

} 
+0

謝謝,看起來像一個偉大的選擇! –

+0

我正在測試.allNotNill(),但保持假,儘管所有不是零。我想測試一下,看看是否至少有一個是零,哪個使用? –

+0

你應該使用atLeastOneNotNil,因爲它是或你的情況。 allNotNil()版本適用於我。 – Sandeep

0

我不知道爲什麼你需要知道的,但如果它是一種比它更好地展開在雨燕2.0

if let email = emailField?.text, password = passwordField?.text { 
    //here you have both email & password 
} 

這樣做,如果你輸入的方法和需要做一些事情的情況下,他們中任何一個零,我會建議使用guard

guard let email = emailField?.text else { 
    // It is nil, do something 
    return 
} 
// if we got here, we have 'email' and it is not nil. 

側面說明:

當你米我猜ean efficient你真的談論的是prettyeasy並且效率不高,因爲在任何情況下,您都必須評估所有參數,看看它們是否爲零。

如果你的確只是希望它是漂亮的,你可以使用.filter檢查

var nilElements = [email,password].filter{0 == nil} 

你會得到僅是nil

+0

謝謝,但這不是我所期待的。如果其中一個值爲零,我有多個if語句來測試多個值。現在我確定有一個選項,如名稱,標題,高度==無或名稱|| title ||高度==無。 –

+0

@TalZion請參閱我的備註。 –

+0

謝謝,但這還不夠漂亮,因爲我需要創建一個數組來測試其中一個是否爲零。 –

2

這裏有一個短版本使用收集文字:

let isAnyNil = ([title, name, height, productName, nil] as [Optional<Any>]).contains { $0 == nil } 

它類似於@ GeneratorOfOne的flatMapcount變體。我更喜歡contains的簡單。

如果你這樣做的時候,我會用一個免費的功能去避免需要指定類型:

func isAnyNil(optionals: Optional<Any> ...) -> Bool { 
    return optionals.contains { $0 == nil } 
} 

isAnyNil(title, name, height, productName)