检查对象中的任何属性是否为零 - Swift 3

时间:2017-06-21 22:24:22

标签: swift class optional

我正在使用Swift 3

想知道是否有任何方法可用于检查对象中的所有属性是否具有值/ nil

例如:

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}是假的,并且将来自if循环

请咨询

3 个答案:

答案 0 :(得分:8)

我强烈建议不要这样做。状态验证是应该从类内部发生的事情。从课堂内部开始,您应该更好地了解如何检查有效性。

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
    }
}

当有很多属性时,@ iPeter要求更紧凑的东西。

extension Vehicle {
    func isReadyToAdvance() -> Bool {
        // Add all the optional properties to optionals
        let optionals: [Any?] = [name, model, VIN]
        if (optionals.contains{ $0 == nil }) { return false }

        // Any other checks

        return true
    }
}

答案 1 :(得分:7)

我不确定这是否应该用于制作应用,因为我不太熟悉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将为false(Vehicle的所有属性都已设置)。例如,注释设置model的行,hasMissingValues的值现在为真。

注意:可能有更好的方法将$0.value(类型Any)与nil进行比较。此外,这适用于类的任何类型的属性(不仅仅是String)。

答案 2 :(得分:2)

如果你有很多字段,可以使用这种方法:

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

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