Ios 统计Swift中的可选属性

Ios 统计Swift中的可选属性,ios,swift,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)检查每一个,但是有更简单(更好)的方法吗 我认为没有办法做到这一点,但您可以像这样实现自己的功能: class test

是否可以计算所有不为零的财产

例如:

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)检查每一个,但是有更简单(更好)的方法吗

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

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

    }

}

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

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

    }

}

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

func numberOfNonNil() -> Int {
    let vals = [val1, val2, val3, val4, val5]
    return flatMap { $0 }.count
}
flatMap(:)
接受一个闭包,该闭包接受数组中的单个元素并返回可选值(
element->T?
),然后返回将该闭包应用于数组中每个元素的结果,忽略
nil


唯一简单的方法是首先将值存储为可选的
Int
s数组:

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

这是因为所有值都可以表示为类型
Any?

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

func numberOfNonNil() -> Int {
    let vals = [val1, val2, val3, val4, val5]
    return flatMap { $0 }.count
}
flatMap(:)
接受一个闭包,该闭包接受数组中的单个元素并返回可选值(
element->T?
),然后返回将该闭包应用于数组中每个元素的结果,忽略
nil


唯一简单的方法是首先将值存储为可选的
Int
s数组:

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

这是因为所有的值都可以表示为类型
Any?

@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
}
func numberOfOptionalProperties() -> Int {
   return Mirror(reflecting: self).children.reduce(0) {
        Mirror(reflecting: $1.value).displayStyle == .Optional ? $0 + 1 : $0
    }
}

@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
}
func numberOfOptionalProperties() -> Int {
   return Mirror(reflecting: self).children.reduce(0) {
        Mirror(reflecting: $1.value).displayStyle == .Optional ? $0 + 1 : $0
    }
}

谢谢-这是我一直在考虑的解决方案-但是有大约30个可选属性-我在这里有点懒-认为有更“快速”的东西:)谢谢-这是我一直在考虑的解决方案-但是有大约30个可选属性-我在这里有点懒-认为有更“快速”的东西:)您也可以将
vals.filter{$0!=nil}
替换为
vals.flatMap{$0}
,因为flatMap会自动忽略nil值。@fantatitude很好。如果你不介意的话,我会在回答中改变这一点。有一件事。就在我的例子中,所有的值都是整数——但在我的现实生活场景中,我会得到不同的选项(比如字符串、整数、浮点数、double和其他类——所以我真的不能将它们组合起来)——但对于有相同要求的人来说,这是一个很好的答案。是的,当然:)很高兴我能帮助改进answer@derdida那很好,您只需要显式地将数组向下转换为可以包含所有不同类型的类型(
Any?
,顾名思义,它适用于任何可选类型)。请参见上面的编辑。您也可以用
vals.flatMap{$0}
替换
vals.filter{$0!=nil}
,因为flatMap会自动忽略nil值。@fantatitude很好。如果你不介意的话,我会在回答中改变这一点。有一件事。就在我的例子中,所有的值都是整数——但在我的现实生活场景中,我会得到不同的选项(比如字符串、整数、浮点数、double和其他类——所以我真的不能将它们组合起来)——但对于有相同要求的人来说,这是一个很好的答案。是的,当然:)很高兴我能帮助改进answer@derdida那很好,您只需要显式地将数组向下转换为可以包含所有不同类型的类型(
Any?
,顾名思义,它适用于任何可选类型)。请参见上面的编辑。