是否可以统计所有非零的属性?
例如:
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)检查每一个 - 但是有更简单(更好)的方法吗?
答案 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
}
}