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?
,顾名思义,它适用于任何可选类型)。请参见上面的编辑。