【问题标题】:Getting error Cannot convert value of type '(String,_) -> String' to expected argument type '(_, String) -> _'出现错误无法将类型“(String,_)-> String”的值转换为预期的参数类型“(_,String)-> _”
【发布时间】:2017-02-26 20:11:58
【问题描述】:

我正在尝试获取数组“reviewArray”中所有值的总和。在网上查找内容后,我设置了 self.reviewArray.reduce,但我收到错误消息,我不太确定到底该怎么做“无法将类型 '(String,) -> String' 的值转换为预期的参数类型 '(, String) -> _'" 我该如何解决这个问题?

这是我的代码

var reviewArray = [String]()
func testForGettingAllValues(){
 let uid = user2?.id
    let ref =  FIRDatabase.database().reference().child("userRating").child(uid!)
        ref.queryOrdered(byChild: "ratingNumber").observe(.value, with: {(snapshot) in
            if snapshot.exists(){
                if let values = snapshot.value as? [String: AnyObject]{
                    for reviews in values {
                        if let userReviews =  reviews.value["ratingNumber"] as? String{
                            self.reviewArray.append(userReviews)
                                print("this is to check what is inside  of the array", self.reviewArray)

//This is where i'm trying to find the sum of all the values inside of my array
                                    var ratingSum =  self.reviewArray.reduce(0,{$0 + $1})


                        }

                    }
                }
            }
        })
    }
}

【问题讨论】:

    标签: ios arrays swift firebase firebase-realtime-database


    【解决方案1】:

    您的reviewArray[String],因此您需要将评级转换为Double

    var ratingSum = self.reviewArray.reduce(0, {$0 + (Double($1) ?? 0)})
    

    由于String 可能无法转换为Double,因此我使用nil 合并运算符 ?? 在这种情况下使用0


    或者,您可以先使用flatMap 将数组转换为[Double],以删除未转换为Double 的值,然后再使用reduce

    var ratingSum = self.reviewArray.flatMap { Double($0) }.reduce(0, +)
    

    如果您的评分是整数值,只需使用Int 而不是上面的Double


    如果您的字符串有前导和尾随空格,则需要在转换为 Double 之前将其删除:

    Double($0.trimmingCharacters(in: .whitespaces)) ?? 0
    

    【讨论】:

    • 它出现了“0”,所以我猜我的字符串没有转换为 Int,还有什么我可以提供的吗? @vacawama
    • 在转换为 Int 之前,您可能需要修剪前导和尾随空格。
    • 你可以self.reviewArray.forEach { print("***\($0)***") } 看看你的阵列是什么样子的吗? *** 和数字之间不要有空格。
    • 好吧,这就是打印出来的 *** 4.50 *** *** 4.50 ***
    • 好的,你有浮点值,所以你需要使用Double而不是Int。是打印字符串中的数字旁边的那些空格,还是真的在数组中?
    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2015-12-24
    相关资源
    最近更新 更多