【问题标题】:Getting the sum of an array of doubles in swift快速获取双精度数组的总和
【发布时间】:2015-02-03 23:39:26
【问题描述】:

我有一个字符串数字数组,我从核心数据中获取并转换为双精度数。完成此操作后,我想得到他们的总和,但出现错误。我试过这样:

override func viewDidLoad() {
    super.viewDidLoad()

        //CoreData
        let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let managedContext : NSManagedObjectContext = appDelegate.managedObjectContext!
        var fetchRequest = NSFetchRequest(entityName: "Log")
        fetchRequest.returnsObjectsAsFaults = false;
        var results: NSArray = managedContext.executeFetchRequest(fetchRequest, error: nil)!

        if (results.count > 0) {
            for res in results {
                var totalWorkTimeInHoursString = res.valueForKey("totalWorkTimeInHoursString")  as String
                //get double value of strings array
                var totalWorkTimeInHoursNSString = NSString(string: totalWorkTimeInHoursString)
                var totalWorkTimeInHoursNSStringDoubleValue = totalWorkTimeInHoursNSString.doubleValue
                lastLogHoursWorked.text = "\(totalWorkTimeInHoursString) hours"
                totalHoursWorkedSum.text = "\(totalWorkTimeInHoursNSStringDoubleValue)"

                let sum = totalWorkTimeInHoursNSStringDoubleValue.reduce(0,+)
                    //throws an error saying 'Double' does not have a member named 'reduce'

                println(totalWorkTimeInHoursNSStringDoubleValue)
                    //lists the array of doubles in console successfully
                println(sum)
                    //checking to see if 'sum' works properly

        }
        }else {
            println("zero results returned, potential error")
        }
}

我是否正确地处理了这个问题?我错过了什么?

【问题讨论】:

标签: arrays core-data swift double reduce


【解决方案1】:

查看您的代码,我推断results 是一个字典数组,每个字典都有一个totalWorkTimeInHoursString 键,其值是一个双数的字符串表示形式。

我会使用一些函数式方法来解决它,使用filtermapreduce

if results.count > 0 {
    var res = results as [NSDictionary]

    var result = res.filter { $0["totalWorkTimeInHoursString"] is String }
        .map { ($0["totalWorkTimeInHoursString"] as NSString).doubleValue }
        .reduce (0, +)
}

代码的作用:

  • results数组转换为NSDictionary数组
  • 通过删除所有没有totalWorkTimeInHoursString 键或其对应值不是字符串的元素(它们是字典)来过滤数组
  • 通过提取与totalWorkTimeInHoursString键对应的值,将数组的每个元素转换为双精度值,转换为NSString,然后转换为Double
  • 应用reduce 方法,传递+ 运算符对Double 的结果数组求和

这是我在操场上测试我的解决方案的数据:

var results: NSArray = [
    ["totalWorkTimeInHoursString": "10.0"],
    ["totalWorkTimeInHoursString": "5.0"]
]

【讨论】:

  • 刚刚试了一下,报错“致命错误:NSArray element failed to match the Swift Array Element type”
  • results 中的某些元素是否可能不是字典?如果没有,您是否有关于该错误的任何其他详细信息?
  • 此时我要做的是检索核心数据属性列表(这些属性是存储为字符串的数字)并获得所有属性的总和。我目前将它们全部适当地加载到 tableview 中,但在这个视图控制器中,我只想要一个带有它们总和的标签。希望这能更好地解释我的情况?谢谢你的耐心! :)
  • 这解释了你的目标是什么,但不幸的是无助于修复错误:)。我认为问题在于executeFetchRequest 返回NSManagedObject 的数组(我没有过多使用coredata,所以不确定)。您可以尝试将result 转换为[NSManagedObject] 而不是[NSDictionary],并解决编译问题(使用valueForKey 而不是下标)
【解决方案2】:

ReduceArray 上的一个函数。当您说array.reduce(0, +) 时,您的意思是“这是一个双精度数组。通过对元素应用+ 操作将元素组合成一个值,从0 作为值开始”。

您不能reduce 单个值。

【讨论】:

  • 但在这种情况下,“totalWorkTimeInHoursNSStringDoubleValue”是一个双精度数组,对吗?至少当我调用它时,它会在控制台上打印一个双精度数组。有没有其他方法可以实现我的目标?
  • 不,它不是一个数组,它是一个 Double。如果您看到一系列双打,请剪切/粘贴您看到的内容。
  • @Leighton 是的,您已将字符串转换为双精度值。这是双倍的。
猜你喜欢
  • 2016-07-23
  • 1970-01-01
  • 2018-11-14
  • 2017-11-05
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 2019-09-18
相关资源
最近更新 更多