计算Swift中的可选属性

时间:2015-08-07 09:55:23

标签: ios swift

是否可以统计所有非零的属性?

例如:

class test {
   var val1:Int?
   var val2:Int?
   var val3:Int?
   var val4:Int?
   var val5:Int?
}

var test = test()
test.val1 = 1
test.val2 = 2

如何找出2个属性设置?我可以用(!= nil)检查每一个 - 但是有更简单(更好)的方法吗?

3 个答案:

答案 0 :(得分:4)

您可以使用便捷方法手动执行此操作:

func numberOfNonNil() -> Int {
    let vals = [val1, val2, val3, val4, val5]
    return flatMap { $0 }.count
}

flatMap(_:)接受一个闭包,它接受数组的一个元素并返回一个可选值(Element -> T?),并返回将该闭包应用于数组的每个元素的结果,{{ 1}}值被忽略。


使这个更简单的唯一方法是首先将值存储为可选nil的数组:

Int

然后,您仍然可以使用数组下标符号(class Test { var vals: [Int?] } )访问每个单独的值。然后,您可以使用上面的便捷方法中的第二行(let val2 = vals[1]然后filter)来获取非零值的数量:

count

如果您的值的类型不同,如果将数组转换为包含所有不同类型的类型,此方法仍然有效:

let nonNilCount = vals.flatMap { $0 }.count

这是有效的,因为所有值都可以表示为class Test { var val1: Int? var val2: Double var val3: String var val4: MyRandomClass? func numberOfNonNil() -> Int { let vals = [val1, val2, val3, val4, val5] as [Any?] return flatMap { $0 }.count } } 类型。

答案 1 :(得分:1)

我认为没有办法做到这一点,但你可以像这样实现自己的功能:

class test {
    var val1:Int?
    var val2:Int?
    var val3:Int?
    var val4:Int?
    var val5:Int?

    func setVarsCount() -> Int {

        var setVariablesCount = 0

        if val1 != nil {
            setVariablesCount++
        }

        if val2 != nil {
            setVariablesCount++
        }

        if val3 != nil {
            setVariablesCount++
        }

        if val4 != nil {
            setVariablesCount++
        }

        if val5 != nil {
            setVariablesCount++
        }

        return setVariablesCount

    }

}

答案 2 :(得分:1)

@Stuarts答案很好,但您必须知道该类的属性,如果您向该类添加另一个属性,则还必须修改您的方法。要避免此问题,您可以使用反射,例如

Swift 1.2

func numberOfOptionalProperties() -> Int {
    let mirror = reflect(self)
    var numberOfOptionalProperties = 0

    for index in 0..<mirror.count {

        if mirror[index].1.disposition == .Optional {
            ++numberOfOptionalProperties
        }
    }
    return numberOfOptionalProperties
}

Swift 2.0

func numberOfOptionalProperties() -> Int {
   return Mirror(reflecting: self).children.reduce(0) {
        Mirror(reflecting: $1.value).displayStyle == .Optional ? $0 + 1 : $0
    }
}
相关问题