Swift Reduce - 添加字符串的Int值

时间:2017-02-20 15:05:16

标签: arrays swift nsarray

我有一个自定义对象ZZ的数组A,其属性为:

String a1

我想添加数组中所有元素的a1属性并返回NSNumber值。由于值a1是一个字符串,我也必须在旅途中将其转换为双精度。

我尝试按照以下方式做点什么:

ZZ?.reduce(0, {$0.Int(a1) + $1.Int(a1)})

但是在语法上遇到了很多错误。

我该怎么办呢?

3 个答案:

答案 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

最后请注意,以上所有内容均未执行从StringDouble投射,但尝试<{1>}的初始化 } Double值,使用StringString符合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)