Ошибка Swift - «Невозможно вызвать значение типа« SwiftStockChart.LabelForValueGetter »(он же« (CGFloat) -> String ») со списком аргументов« (Value: CGFloat) »

-1

Я получаю две ошибки, когда пытаюсь установить точки графика из Yahoo Finance API с помощью Swift. Первая ошибка говорит

'Нельзя вызывать значение типа' SwiftStockChart.LabelForValueGetter '(aka' (CGFloat) → String ') с списком аргументов' (Value: CGFloat) '

это на линии

let text = labelForValue(value: minValue! + (maxValue! - minValue!) / CGFloat(verticalGridStep!) * CGFloat((i + 1)))

Тогда я также получаю сообщение об ошибке

'Невозможно вызвать значение типа' SwiftStockChart.LabelForValueGetter '(aka' (Int) → String ') с списком аргументов' (Value: Int) '

И это онлайн

let text = labelForIndex(index: i)

Полный код:

func setChartPoints(points: [ChartPoint]) {

    if points.isEmpty { return }

    dataPoints = points

    computeBounds()


    if maxValue!.isNaN { maxValue = 1.0 }

    for i in 0 ..< verticalGridStep! {

        let yVal = axisHeight! + margin! - CGFloat((i + 1)) * axisHeight! / CGFloat(verticalGridStep!)
        let p = CGPoint(x: (valueLabelPosition! == .right ? axisWidth! : 0), y: yVal)

        let text = labelForValue(value: minValue! + (maxValue! - minValue!) / CGFloat(verticalGridStep!) * CGFloat((i + 1)))

        let rect = CGRect(x: margin!,  y: p.y + 2, width: self.frame.size.width - margin! * 2 - 4.0, height: 14.0)
        let width = text.boundingRect(with: rect.size,
                                      options: NSStringDrawingOptions.usesLineFragmentOrigin,
                                      attributes:[NSFontAttributeName : valueLabelFont!],
                                      context: nil).size.width

        let xPadding = 6
        let xOffset = width + CGFloat(xPadding)

        let label = UILabel(frame: CGRect(x: p.x - xOffset + 5.0, y: p.y, width: width + 2, height: 14))
        label.text = text
        label.font = valueLabelFont
        label.textColor = valueLabelTextColor
        label.textAlignment = .center
        label.backgroundColor = valueLabelBackgroundColor!

        self.addSubview(label)
        axisLabels.append(label)

    }

    for i in 0 ..< horizontalGridStep! + 1 {

        let text = labelForIndex(index: i)

        let p = CGPoint(x: margin! + CGFloat(i) * (axisWidth! / CGFloat(horizontalGridStep!)) * 1.0, y: axisHeight! + margin!)


        let rect = CGRect(x: margin!, y: p.y + 2, width: self.frame.size.width - margin! * 2 - 4.0, height: 14)
        let width = text.boundingRect(with: rect.size,
                                      options: NSStringDrawingOptions.usesLineFragmentOrigin,
                                      attributes:[NSFontAttributeName : indexLabelFont!],
                                      context: nil).size.width

        let label = UILabel(frame: CGRect(x: p.x - 5.0, y: p.y + 5.0, width: width + 2, height: 14))
        label.text = text
        label.font = indexLabelFont!
        label.textAlignment = .left
        label.textColor = indexLabelTextColor!
        label.backgroundColor = indexLabelBackgroundColor!

        self.addSubview(label)
        axisLabels.append(label)

    }
Теги:
graph
uilabel
swift3
cgfloat

2 ответа

0
Лучший ответ

Угадайте: вы используете код или документацию для чтения, предназначенную для версии SwiftStockKit до Swift 3.

Это предположение, поскольку вопрос не дает достаточно подробностей, чтобы быть уверенным. Так что это может быть неправильно!


Предложение Swift SE0111: Удаление системной значимости ярлыков аргументов функции удалило значимость меток аргументов в типах функций и было реализовано в Swift 3.

SwiftStockKit, как в настоящее время в Интернете, определяет labelForValue используя:

typealias LabelForValueGetter = (value: CGFloat) -> String
var labelForValue: LabelForValueGetter!

это не будет компилироваться под Swift 3, оно должно быть изменено (как указано в инструкции компилятора):

typealias LabelForValueGetter = (_ value: CGFloat) -> String
var labelForValue: LabelForValueGetter!

Теперь посмотрим на вашу ошибку:

Невозможно вызвать значение типа "SwiftStockChart.LabelForValueGetter" (aka '(CGFloat) → String') с списком аргументов '(Value: CGFloat)

Первый тип здесь не имеет метки аргументов, список аргументов, который вы поставляете, - так что это несоответствие, удалите метку в списке аргументов.

Если вы используете копию SwiftStockKit, которая была обновлена для Swift 3, но вы кодируете более раннюю версию, вы, вероятно, получите гораздо больше ошибок, чем 2, которые вы сообщаете здесь.

НТН

  • 0
    Это исправило первую ошибку, но не вторую? Есть ли у вас какие-либо предложения по поводу let text = labelForIndex (index: i)?
  • 0
    Это та же проблема, только с другим типом функции. Может быть, может быть и больше, вы можете сравнить (diff / FileMerge) источник SwiftStockKit, который вы используете, с тем, который указан выше, так как я предполагаю, что ваша документация относится к (до Swift 3) веб-версии.
0

Похоже, вы пытаетесь разделить строку на CGFloat.

Эта строка

let text = labelForValue(value: minValue! + (maxValue! - minValue!) / CGFloat(verticalGridStep!) * CGFloat((i + 1)))

имеет структуру типа:

String/CGFloat * CGFloat

Что именно вы пытаетесь сделать с этой линией? Я могу отредактировать свой ответ с помощью решения, если вы можете дать мне еще один контекст. Также вы бы хотели связаться с библиотекой, которую используете.

  • 0
    Я пытаюсь установить точки графика на графике из API Yahoo с помощью Alamofire
  • 0
    Вы хотите, чтобы я дал больше кода?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню