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

5jdjgkvh  于 2023-04-19  发布在  Swift
关注(0)|答案(4)|浏览(122)

使用Swift 3
想知道是否有任何方法可用于检查对象中的所有属性是否都具有value / 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。
请指教

6qfn3psc

6qfn3psc1#

我不确定这是否应该用于生产应用程序,因为我不太熟悉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的值现在将为true。
注意:可能有一个更好的方法来比较$0.valueAny类型)和nil。而且,这适用于类的任何类型(不仅仅是String)的属性。

qncylg1j

qncylg1j2#

我强烈建议不要这样做。状态验证应该在类内部进行。在类内部,你应该更好地知道如何检查有效性。

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

bq3bfh9z3#

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

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

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

a8jjtwal4#

这个问题的最佳解决方案是

let mirror = Mirror(reflecting: yourStruct)
let hasNilValues = mirror.children.contains(where: { "\($0.value)" == "nil" })

相关问题