2017-06-21 62 views
1

im使用夫特3檢查,如果在一個對象中的任何屬性是nil - SWIFT 3

想知道的任何方法是否可用,以檢查是否在一個對象中的所有屬性具有值/無

例如:

class Vehicle { 
var name : String? 
var model: String? 
var VIN: String? 
} 

let objCar = Vehicle() 
objCar.name = "Volvo" 

if objCar.{anyProperty} ! = nil { 
//Go to other screen 
} 

我在尋找{anyProperty}方法,只有當我有objCar所有屬性的值時才返回true。在我們的例子中,objCar沒有模型和VIN等{} anyProperty是假的,並會出來,如果循環

請諮詢

+1

難道它甚至有意義,讓他們成爲擺在首位可選? 'Car' ***需要***擁有'name','model,'和'VIN'。 「模型」和「VIN」不能改變,所以它們沒有意義,讓它們變成'var'變量 – Alexander

+0

嗨亞歷山大,謝謝指出 - 但這只是一個例子,我指的是明白我的要求是。對不起,在那個時候找不到更好的例子 – Jack

回答

2

我強烈建議不要這樣做。狀態驗證是應該從類內部發生的。從課堂內部,你應該更好地瞭解如何檢查有效性。

class Vehicle { 
    var name: String? 
    var model: String? 
    var VIN: String? 

    func isReadyToAdvance() -> Bool { 
     return name != nil && model != nil && VIN != nil 
    } 
} 

let objCar = Vehicle() 
objCar.name = "Volvo" 

if objCar.isReadyToAdvance() { 
    // Go to other screen 
} 

如果有與isReadyToAdvance()他們可以覆蓋方法不同的規則的子類。


如果isReadyToAdvance()沒有意義的基類,然後將其添加爲一個擴展。

extension Vehicle { 
    func isReadyToAdvance() -> Bool { 
     return name != nil && model != nil && VIN != nil 
    } 
} 
5

我不知道這是否應該被用於生產應用程序,因爲我對Swift中的反射並不熟悉(使用Mirror),以及它是否有任何負面因素(性能等)。

這裏所說:

class Vehicle { 
    var name : String? 
    var model: String? 
    var VIN: String? 
} 

let objCar = Vehicle() 
objCar.name = "Volvo" 
objCar.model = "242DL" 
objCar.VIN = "123456" 

let hasMissingValues = Mirror(reflecting: objCar).children.contains(where: { 
    if case Optional<Any>.some(_) = $0.value { 
     return false 
    } else { 
     return true 
    } 
}) 

print(hasMissingValues) 

hasMissingValues將在上面的例子中假(的Vehicle所有屬性被設置)。例如,評論model設置的行,並且hasMissingValues的值現在將成立。


注意:有可能是一個更好的方式來比較$0.value(的Any型)爲零。此外,這適用於任何類型的屬性(不僅僅是String)。

+0

它可以與'$ 0.value一起工作嗎? != nil'或'let _ = $ 0.value as Any?'而不是'case可選 .some(_)= $ 0.value'。 –

+0

@JefferyThomas,那些比較不適合我。 '$ 0.value'的類型是'Any'。對於沒有設置值的孩子(即'nil'),打印'$ 0.value'打印'nil',並打印'$ 0.value as Any?'打印'Optional(nil)'。但是,與'nil'(使用==)相比,這兩者都不會給出'true'。它必須是因爲Swift自然不允許一個'Any'類型的變量被設置爲nil,即使'Any'可以保存任何類型,包括'Optional',參見[這個問題](https:// stackoverflow.com/questions/34644128/why-non-optional-any-can-hold-nil)。 – paulvs

+0

對不起,我會留下原來的評論,即使它是錯誤的。你如何看待'Mirror(反映:$ 0.value).descendant(「some」)!= nil'?我認爲它比案例比較有更明確的意義。 –

0

如果你有很多領域,你可以使用這種方法:

struct S { 
    let x: String? 
    let y: Int 
    let z: Bool 

    func hasNilField() -> Bool { 
     return ([x, y, z] as [Any?]).contains(where: { $0 == nil}) 
    } 
} 
相關問題