我有一个自定义对象ZZ
的数组A
,其属性为:
String a1
我想添加数组中所有元素的a1
属性并返回NSNumber值。由于值a1是一个字符串,我也必须在旅途中将其转换为双精度。
我尝试按照以下方式做点什么:
ZZ?.reduce(0, {$0.Int(a1) + $1.Int(a1)})
但是在语法上遇到了很多错误。
我该怎么办呢?
答案 0 :(得分:1)
应该是这样的。
如果您的字符串包含Double
值:
let result = zz.reduce(0) { $0 + Double($1.a1) ?? 0.0 }
如果您的字符串包含Int
值:
let result = zz.reduce(0) { $0 + Int($1.a1) ?? 0 }
答案 1 :(得分:1)
作为在reduce
数组上直接使用zz
的替代方法,您可以应用Double
的{{1}}初始化(由可用的init?(_:String)
initializer of Double
}进行初始化在a1
zz
之后的flatMap
调用中zz
的每个元素的成员,然后您应用reduce
对已成功初始化为Double
个实例的元素求和。
struct Custom {
let a1: String
init(_ a1: String) { self.a1 = a1 }
}
let zz: [Custom] = [Custom("1.4"), Custom("z"), Custom("3.1")]
let sumOfValids = zz.lazy.flatMap{ Double($0.a1) }.reduce(0, +) // 4.5
最后一部分(如果你真的想要这个)
“我想添加数组中所有元素的a1属性 并且返回
NSNumber
值“。
您可以简单地使用appropriate NSNumber
by Double
initializer。
最后请注意,以上所有内容均未执行从String
到Double
的投射,但尝试<{1>}的初始化 } Double
值,使用String
中String
符合Double
的{{1}}初始化程序,a1
符合String
。
“由于值
Double
是{{1}},我还必须将其转换为 移动{{1}}也是“。
答案 2 :(得分:0)
假设一个不可转换的String为Double意味着一个0.0值......
public class Custom
{
public var theProperty: String
public init(value: String)
{
self.theProperty = value
}
}
let c1: Custom = Custom(value: "1.1")
let c2: Custom = Custom(value: "a")
let c3: Custom = Custom(value: "3.2")
let array: [Custom] = [ c1, c2, c3 ]
let result: Double = array.map({
guard let theProperty = Double($0.theProperty) else
{
return 0.0
}
return theProperty
})
.reduce(0.0) { $0 + $1 }
print(result)